home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 140 / Gekkan Dennou Club - 2000.1 Vol. 140 (Japan).7z / Gekkan Dennou Club - 2000.1 Vol. 140 (Japan) (Track 1).bin / tools / has060 / hassrc87.lzh / objgen.s < prev    next >
Text File  |  1999-10-08  |  79KB  |  3,243 lines

  1. ;----------------------------------------------------------------
  2. ;    X68k High-speed Assembler
  3. ;        オブジェクトファイル生成
  4. ;        < objgen.s >
  5. ;
  6. ;    $Id: objgen.s,v 2.9  1999 10/ 8(Fri) 21:52:11 M.Kamada Exp $
  7. ;
  8. ;        Copyright 1990-94  by Y.Nakamura
  9. ;              1996-99  by M.Kamada
  10. ;----------------------------------------------------------------
  11.  
  12.     .include    has.equ
  13.     .include    symbol.equ
  14.     .include    register.equ
  15.     .include    tmpcode.equ
  16.     .include    cputype.equ
  17.     .include    eamode.equ
  18.  
  19.     .cpu    68000
  20.     .text
  21.  
  22.  
  23. ;----------------------------------------------------------------
  24. ;    パス3(オブジェクトファイルの生成)
  25. ;----------------------------------------------------------------
  26. asmpass3::
  27.     move.b    #3,(ASMPASS,a6)
  28.     tst.b    (MAKEPRN,a6)
  29.     beq    asmpass31
  30.     lea.l    (SOURCEPTR,a6),a1
  31.     bsr    frewind            ;ソースファイル先頭に移動
  32.     move.l    a1,(INPFILPTR,a6)
  33. asmpass31:
  34.     move.l    (CPUSYMBOL,a6),d0
  35.     beq    asmpass319
  36.     movea.l    d0,a1
  37.     move.l    (STARTCPU,a6),(SYM_VALUE,a1)
  38. asmpass319:
  39.     lea.l    (TEMPFILPTR,a6),a1
  40.     bsr    frewind            ;テンポラリファイル先頭に移動
  41.     lea.l    (OBJFILPTR,a6),a0
  42.     move.l    a0,(OUTFILPTR,a6)
  43.     movea.l    (OBJFILE,a6),a0
  44.     bsr    createopen        ;オブジェクトファイルのオープン
  45.  
  46.     clr.w    (NUMOFERR,a6)
  47.     sf.b    (ISASMEND,a6)
  48.     clr.l    (DSBSIZE,a6)
  49.     clr.l    (OBJLENCTR,a6)
  50.     sf.b    (ISOBJOUT,a6)
  51.     clr.w    (OBJCONCTR,a6)
  52.  
  53.     clr.w    (IFNEST,a6)
  54.     clr.w    (INCLDNEST,a6)
  55.     clr.w    (MACNEST,a6)
  56.     clr.w    (MACREPTNEST,a6)
  57.     clr.w    (MACLOCSMAX,a6)
  58.     sf.b    (ISNLIST,a6)
  59.     clr.w    (PAGEFLG,a6)
  60.     sf.b    (ISMACDEF,a6)
  61.  
  62.     bsr    makeobjhead        ;オブジェクトヘッダの作成
  63.     bsr    resetlocctr        ;ロケーションカウンタの初期化
  64.     bsr    outaligninfo        ;アラインメント情報の出力
  65.     bsr    outxrefdef        ;外部シンボルの出力
  66.     bsr    dopass3            ;パス3の実行
  67.     bsr    xdefmodify        ;外部定義シンボル出力の修正
  68.     bsr    prnsymtbl        ;シンボル名テーブルの出力
  69.     bsr    prnundefsym        ;未定義シンボルリストの出力
  70.     bsr    inpclose        ;ファイルのクローズ
  71.     bsr    outclose
  72.     rts
  73.  
  74.  
  75. ;----------------------------------------------------------------
  76. ;    オブジェクトファイルのヘッダを作成する
  77. ;----------------------------------------------------------------
  78. makeobjhead:
  79.     move.w    #$D000,d0        ;D000 [ファイルサイズ] ファイル名~ 00
  80.     bsr    wrtd0w
  81.     moveq.l    #0,d0
  82.     bsr    wrtd0l
  83.     lea.l    (SOURCENAME,a6),a0
  84.     bsr    wrtstr
  85.     lea.l    (section_name,pc),a0
  86.     lea.l    (LOCCTRBUF,a6),a1
  87.     moveq.l    #4-1,d1
  88.     move.w    #$C001,d2
  89.     tst.b    (MAKERSECT,a6)
  90.     beq    makeobjhead1
  91.     moveq.l    #10-1,d1        ;相対セクションを使用した場合
  92. makeobjhead1:
  93.     move.w    d2,d0
  94.     bsr    wrtd0w            ;C0[セクション番号] [オブジェクト長] セクション名~ 00
  95.     move.l    (a1)+,d0        ;ロケーションカウンタ値
  96.     bsr    wrtd0l
  97.     bsr    wrtstr            ;セクション名
  98.     addq.b    #1,d2
  99.     dbra    d1,makeobjhead1
  100.     move.l    (REQFILPTR,a6),d0
  101.     beq    makeobjhead9        ;requestファイルがない
  102. makeobjhead2:
  103.     movea.l    d0,a1
  104.     move.w    #$E001,d0        ;E001 requestファイル名~ 00
  105.     bsr    wrtd0w
  106.     lea.l    (4,a1),a0
  107.     bsr    wrtstr
  108.     move.l    (a1),d0
  109.     bne    makeobjhead2
  110. makeobjhead9:
  111.     rts
  112.  
  113. section_name:                ;セクション名
  114.     .dc.b    'text',0,'data',0,'bss',0,'stack',0
  115.     .dc.b    'rdata',0,'rbss',0,'rstack',0,'rldata',0,'rlbss',0,'rlstack',0
  116.     .even
  117.  
  118.  
  119. ;----------------------------------------------------------------
  120. ;    アラインメント情報を出力する
  121. ;----------------------------------------------------------------
  122. outaligninfo:
  123.     move.b    (MAKEALIGN,a6),d0
  124.     or.b    (MAKESYMDEB,a6),d0
  125.     beq    outaligninfo9        ;アラインメント情報もデバッグ情報も不要
  126.     tst.b    (MAKEALIGN,a6)
  127.     bne    outaligninfo1        ;デバッグ情報のみが必要な場合は,
  128.     move.b    #1,(MAXALIGN,a6)        ;アライン値は2^1=2とする。
  129. outaligninfo1:
  130.     lea.l    (LINEBUF,a6),a0
  131.     move.b    #'*',(a0)+        ;'*'+ファイル名+'*' というシンボルを作成する
  132.     movea.l    (SOURCEFILE,a6),a1
  133.     bsr    strcpy
  134.     move.b    #'*',(a0)+
  135.     clr.b    (a0)+
  136.     move.w    #$B204,d0        ;B204 [アライン値] '*'+ファイル名+'*' ~ 00
  137.     bsr    wrtd0w
  138.     moveq.l    #0,d0
  139.     move.b    (MAXALIGN,a6),d0
  140.     bsr    wrtd0l
  141.     lea.l    (LINEBUF,a6),a0
  142.     bra    wrtstr
  143.  
  144. outaligninfo9:
  145.     rts
  146.  
  147.  
  148. ;----------------------------------------------------------------
  149. ;    外部参照・定義シンボルを出力する
  150. ;----------------------------------------------------------------
  151. outxrefdef:
  152.     clr.l    (XREFSYMNO,a6)
  153.     sf.b    (ISXDEFMOD,a6)
  154.     sf.b    (ISUNDEFSYM,a6)
  155.  
  156.     move.l    (SYMTBLBEGIN,a6),d3
  157.     beq    outxrefdef9        ;シンボルが一つもない
  158. outxrefdef1:
  159.     movea.l    d3,a1
  160.     move.w    #SYMEXTCOUNT-1,d2    ;1つのテーブルブロック中のシンボル数
  161.     move.l    (a1)+,d3
  162.     bne    outxrefdef2        ;まだ続きのブロックがある
  163.     sub.w    (SYMTBLCOUNT,a6),d2    ;最後のブロックの場合
  164.  
  165. outxrefdef2:
  166.     tst.b    (SYM_TYPE,a1)        ;cmpi.b #ST_VALUE,(SYM_TYPE,a1)
  167.     bne    outxrefdef7        ;数値シンボル以外なら何もしない
  168.  
  169.     move.b    (SYM_EXTATR,a1),d0
  170.     cmpi.b    #SECT_XDEF,d0
  171.     beq    outxdef            ;外部定義シンボル
  172.     cmpi.b    #SECT_XREF,d0
  173.     beq    outxref            ;外部参照シンボル
  174.     cmpi.b    #SECT_GLOBL,d0
  175.     beq    outglobl        ;globlシンボル
  176.     tst.b    d0
  177.     bne    outcomm            ;コモンシンボル
  178.  
  179.     tst.b    (SYM_ATTRIB,a1)        ;(cmpi.b #SA_UNDEF,(SYM_ATTRIB,a1))
  180.     beq    outxrefdef3
  181.     tst.b    (ALLXDEF,a6)        ;定義済シンボルの場合
  182.     bne    outxdef0        ;/dオプションがあれば外部定義にする
  183.     bra    outxrefdef8
  184.  
  185. outxrefdef3:
  186.     tst.b    (ALLXREF,a6)        ;未定義シンボルの場合
  187.     bne    outxref0        ;/uオプションがあれば外部参照にする
  188. outxrefdef5:
  189.     st.b    (ISUNDEFSYM,a6)        ;未定義シンボルの場合
  190. outxrefdef8:
  191.     lea.l    (SYM_TBLLEN,a1),a1    ;次のシンボルアドレス
  192.     dbra    d2,outxrefdef2
  193.     tst.l    d3
  194.     bne    outxrefdef1        ;続きのテーブルブロックがある
  195.  
  196.     cmp.l    #$8000,(XREFSYMNO,a6)
  197.     bcc    toomanyexabort        ;外部参照シンボルが多すぎるので中止する
  198. outxrefdef9:
  199.     rts
  200.  
  201. outxrefdef7:
  202.     cmpi.b    #ST_REAL,(SYM_TYPE,a1)
  203.     bne    outxrefdef8
  204.     tst.b    (SYM_FSIZE,a1)
  205.     bpl    outxrefdef8
  206.     st.b    (ISUNDEFSYM,a6)        ;未定義の浮動小数点実数シンボルの場合
  207.     bra    outxrefdef8
  208.  
  209. outglobl:                ;globlシンボルの出力
  210.     tst.b    (SYM_ATTRIB,a1)        ;(cmpi.b #SA_UNDEF,(SYM_ATTRIB,a1))
  211.     beq    outxref0        ;未定義なら外部参照にする
  212.  
  213. outxdef0:
  214. ;??で始まるシンボルを外部定義にしない
  215.     movea.l    (SYM_NAME,a1),a0    ;文字列の先頭
  216.     cmpi.b    #'?',(a0)+
  217.     bne    outxdef0x
  218.     cmpi.b    #'?',(a0)+
  219.     beq    outxrefdef8
  220. outxdef0x:
  221.     move.b    #SECT_XDEF,(SYM_EXTATR,a1)
  222. outxdef:                ;外部定義シンボルの出力
  223.     cmpi.b    #SA_NODET,(SYM_ATTRIB,a1)
  224.     bcs    outxrefdef5        ;未定義ならエラー
  225.     bhi    outxdef1
  226.     st.b    (ISUNDEFSYM,a6)
  227.     st.b    (ISXDEFMOD,a6)        ;未確定値なので後で修正する
  228. outxdef1:
  229.     GETFPTR    OBJFILPTR,d0        ;現在のファイルポインタを得る
  230.     move.l    d0,(SYM_NEXT,a1)    ;シンボル値の修正用
  231.     move.b    (SYM_SECTION,a1),d1
  232.     bsr    outsymbol
  233.     bra    outxrefdef8
  234.  
  235. outxref0:
  236.     move.b    #SECT_XREF,(SYM_EXTATR,a1)
  237. outxref:                ;外部参照シンボルの出力
  238.     move.b    #SA_DEFINE,(SYM_ATTRIB,a1)
  239.     addq.l    #1,(XREFSYMNO,a6)    ;シンボル番号を付ける
  240.     move.l    (XREFSYMNO,a6),(SYM_VALUE,a1)
  241.     moveq.l    #SECT_XREF,d1
  242.     move.b    d1,(SYM_SECTION,a1)
  243.     bsr    outsymbol
  244.     bra    outxrefdef8
  245.  
  246. outcomm:                ;コモンシンボルの出力
  247.     move.b    #SA_DEFINE,(SYM_ATTRIB,a1)
  248.     move.b    d0,d1
  249.     move.b    d0,(SYM_SECTION,a1)
  250.     bsr    outsymbol
  251.     addq.l    #1,(XREFSYMNO,a6)    ;出力後にシンボル番号を付ける
  252.     move.l    (XREFSYMNO,a6),(SYM_VALUE,a1)
  253.     bra    outxrefdef8
  254.  
  255. outsymbol:                ;シンボルの出力
  256.     move.w    #$B200,d0        ;B2[セクション番号] [値] シンボル名~ 00
  257.     move.b    d1,d0
  258.     bsr    wrtd0w
  259.     move.l    (SYM_VALUE,a1),d0    ;xdef:シンボル値/xref:シンボル番号/comm:エリアサイズ
  260.     bsr    wrtd0l
  261.     movea.l    (SYM_NAME,a1),a0
  262.     bra    wrtstr
  263.  
  264.  
  265. ;----------------------------------------------------------------
  266. ;    外部定義シンボルの修正
  267. ;----------------------------------------------------------------
  268. xdefmodify:
  269.     tst.b    (ISXDEFMOD,a6)
  270.     beq    xdefmodify9        ;外部定義シンボルの修正は不要
  271.     sf.b    (ISUNDEFSYM,a6)
  272.  
  273.     move.l    (SYMTBLBEGIN,a6),d3
  274.     beq    xdefmodify9        ;シンボルが一つもない
  275. xdefmodify1:
  276.     movea.l    d3,a0
  277.     move.w    #SYMEXTCOUNT-1,d2    ;1つのテーブルブロック中のシンボル数
  278.     move.l    (a0)+,d3
  279.     bne    xdefmodify2        ;まだ続きのブロックがある
  280.     sub.w    (SYMTBLCOUNT,a6),d2    ;最後のブロックの場合
  281.  
  282. xdefmodify2:
  283.     tst.b    (SYM_TYPE,a0)        ;cmpi.b #ST_VALUE,(SYM_TYPE,a0)
  284.     bne    xdefmodify7        ;数値シンボル以外なら何もしない
  285.  
  286.     cmpi.b    #SECT_XDEF,(SYM_EXTATR,a0)
  287.     beq    xdefdomodify        ;外部定義シンボル
  288.     tst.b    (SYM_ATTRIB,a0)        ;(cmpi.b #SA_UNDEF,(SYM_ATTRIB,a1))
  289.     bne    xdefmodify5
  290. xdefmodify3:
  291.     st.b    (ISUNDEFSYM,a6)        ;未定義シンボルの場合
  292. xdefmodify5:
  293.     lea.l    (SYM_TBLLEN,a0),a0    ;次のシンボルアドレス
  294.     dbra    d2,xdefmodify2
  295.     tst.l    d3
  296.     bne    xdefmodify1        ;続きのテーブルブロックがある
  297. xdefmodify9:
  298.     rts
  299.  
  300. xdefmodify7:
  301.     cmpi.b    #ST_REAL,(SYM_TYPE,a0)
  302.     bne    xdefmodify5
  303.     tst.b    (SYM_FSIZE,a0)
  304.     bpl    xdefmodify5
  305.     st.b    (ISUNDEFSYM,a6)        ;未定義の浮動小数点実数シンボルの場合
  306.     bra    xdefmodify5
  307.  
  308. xdefdomodify:
  309.     cmpi.b    #SA_NODET,(SYM_ATTRIB,a0)
  310.     bls    xdefmodify3        ;未確定ならエラー
  311.     lea.l    (OBJFILPTR,a6),a1
  312.     move.l    (SYM_NEXT,a0),d1
  313.     move.w    #$B200,d0        ;B2[セクション番号] [値] シンボル名~ 00
  314.     move.b    (SYM_SECTION,a0),d0    ;セクション番号を書き込む
  315.     bsr    fmodify
  316.     move.l    (SYM_VALUE,a0),d0    ;シンボル値を書き込む
  317.     addq.l    #2,d1
  318.     swap.w    d0
  319.     bsr    fmodify
  320.     addq.l    #2,d1
  321.     swap.w    d0
  322.     bsr    fmodify
  323.     bra    xdefmodify5
  324.  
  325.  
  326. ;----------------------------------------------------------------
  327. ;    パス3の実行(オブジェクトの出力)
  328. ;----------------------------------------------------------------
  329. dopass3:
  330.     move.l    sp,(SPSAVE,a6)
  331.     lea.l    (dopass31,pc),a0
  332.     move.l    a0,(ERRRET,a6)
  333.     st.b    (PFILFLG,a6)
  334.     bsr    scdinit            ;SCDデータ用ワークの初期化
  335.     clr.l    (LINENUM,a6)        ;行番号カウンタをリセット
  336. dopass31:
  337.     move.l    (LOCATION,a6),(LCURLOC,a6)
  338.     bsr    tmpreadd0w
  339.     move.w    d0,d1
  340.     beq    dopass32        ;テンポラリファイル終了
  341. dopass315:
  342.     clr.b    d1
  343.     sub.w    d1,d0
  344.     ror.w    #6,d1
  345.     jsr    (pass3_tbl-4,pc,d1.w)
  346.     move.l    (LOCATION,a6),(LCURLOC,a6)
  347.     bsr    tmpreadd0w
  348.     move.w    d0,d1
  349.     bne    dopass315
  350. dopass32:
  351.     sf.b    (ISOBJOUT,a6)        ;(offsetセクションで終了した時のため)
  352.     bsr    outobj1w        ;0000:オブジェクトファイル終了
  353.     bsr    scdout            ;SCDデータの出力
  354.     lea.l    (OBJFILPTR,a6),a1
  355.     bsr    fflush            ;オブジェクトファイルバッファをフラッシュ
  356.     move.l    (OBJLENCTR,a6),d0    ;オブジェクトファイル長を書き込む
  357.     moveq.l    #2,d1
  358.     swap.w    d0
  359.     bsr    fmodify
  360.     moveq.l    #4,d1
  361.     swap.w    d0
  362.     bsr    fmodify
  363.     tst.b    (MAKEPRN,a6)
  364.     bne    prnline            ;PRNファイル最終行を出力
  365.     rts
  366.  
  367. ;----------------------------------------------------------------
  368. ;    テンポラリファイルコード処理アドレス
  369. pass3_tbl:
  370.     bra.w    linetop        ;01    1行開始
  371.     bra.w    symdata        ;02    シンボル値
  372.     bra.w    rpndata        ;03    逆ポーランド式
  373.  
  374.     bra.w    dispadr        ;04    (d,An)
  375.     bra.w    disppc        ;05    (d,PC)
  376.     bra.w    indexadr    ;06    (d,An,Rn)
  377.     bra.w    indexpc        ;07    (d,PC,Rn)
  378.     bra.w    extcode        ;08    拡張ワード
  379.     bra.w    bdadr        ;09    アドレスレジスタ間接ベースディスプレースメント
  380.     bra.w    bdpc        ;0A    PC間接ベースディスプレースメント
  381.     bra.w    odisp        ;0B    アウタディスプレースメント
  382.  
  383.     bra.w    bracmd        ;0C    bra/bsr/b<cc>.s/.w/.l
  384.     bra.w    cpbracmd    ;0D    cpb<cc>.w/.l
  385.     bra.w    dspcode        ;0E    (d,An)/(d,PC)の命令コード
  386.     bra.w    coderpn        ;0F    命令コード埋め込み式データ
  387.     bra.w    constdata    ;10    アドレス非依存データ
  388.     bra.w    bitfield    ;11    ビットフィールド式データ
  389.     bra.w    dscmd        ;12    .ds
  390.     bra.w    dcbcmd        ;13    .dcb
  391.     bra.w    aligncmd    ;14    アラインメントの調整
  392.     bra.w    sectchg        ;15    セクション変更
  393.     bra.w    ofstcmd        ;16    .offset
  394.     bra.w    equconst    ;17    定数の.equ/.set
  395.     bra.w    equexpr        ;18    式・アドレスの.equ/.set
  396.     bra.w    xdefcmd        ;19    .xdef
  397.     bra.w    prnctrl        ;1A    リスト出力制御
  398.     bra.w    pagecmd        ;1B    .page
  399.     bra.w    subttlcmd    ;1C    .subttl
  400.     bra.w    orgcmd        ;1D    .org
  401.     bra.w    endcmd        ;1E    .end
  402.     bra.w    incldopen    ;1F    includeファイル開始
  403.     bra.w    incldend    ;20    includeファイル終了
  404.     bra.w    macdef        ;21    マクロ定義開始
  405.     bra.w    macext        ;22    マクロ展開開始
  406.     bra.w    exitmcmd    ;23    .exitm
  407.     bra.w    reptcmd        ;24    .rept展開開始
  408.     bra.w    irpcmd        ;25    .irp/.irpc展開開始
  409.     bra.w    mdefbgn        ;26    マクロ等定義開始
  410.     bra.w    mdefend        ;27    マクロ等定義終了
  411.     bra.w    lncmd        ;28    .ln
  412.     bra.w    valcmd        ;29    .val
  413.     bra.w    tagcmd        ;2A    .tag
  414.     bra.w    scdshort    ;2B    .endef(短形式)
  415.     bra.w    scdlong        ;2C    .endef(長形式)
  416.     bra.w    funcend        ;2D    .scl -1(関数定義終了)
  417.  
  418.     bra.w    fequset        ;2E    .fequ/.fset
  419.     bra.w    symdef        ;2F    シンボル定義
  420.     bra.w    fdcbcmd        ;30    .dcb(浮動小数点実数)
  421.     bra.w    jbracmd        ;31    jbra/jbsr/jb<cc>
  422.     bra.w    dispopc        ;32    (d,OPC)
  423.     bra.w    linkcmd        ;33    link.w/.l
  424.  
  425.     bra.w    nopdeath    ;34    削除すべきNOP
  426.     bra.w    nopalive    ;35    挿入されたNOP
  427.  
  428.     bra.w    prnadv        ;36    PRNファイルへの先行出力
  429.  
  430.     bra.w    offsymcmd    ;37    .offsym
  431.  
  432.     bra.w    error        ;38    エラー発生
  433.  
  434. ;----------------------------------------------------------------
  435. error:
  436.     move.w    d0,d3
  437.     bsr    tmpreadd0l        ;(ERRMESSYM,a6)
  438.     exg.l    d0,d3            ;d0.w=エラーコード
  439.                     ;d3.l=シンボル(0=シンボルなし)
  440.     bra    errout_d3
  441.  
  442. ;----------------------------------------------------------------
  443. nopdeath:                ;34xx 削除すべきNOP
  444.     bra    tmpreadd0w        ;1ワード読み飛ばす(既に0になっているはず)
  445.  
  446. ;----------------------------------------------------------------
  447. nopalive:                ;35xx 挿入されたNOP
  448.     bsr    f43gwarn
  449.     bra    constdata
  450.  
  451. ;----------------------------------------------------------------
  452. symdef:                    ;2FXX シンボル定義
  453.     bra    tmpreadd0l
  454.  
  455. ;----------------------------------------------------------------
  456. dspcode:                ;0Exx (d,An)/(d,PC)の命令コード
  457. extcode:                ;08xx 拡張ワード
  458.     moveq.l    #2-1,d0
  459. ;    bra    constdata        ;拡張ワードを出力する
  460.  
  461. ;----------------------------------------------------------------
  462. constdata:                ;10xx アドレス非依存データ
  463.     move.w    d0,d1
  464. constdata1:
  465.     bsr    tmpreadd0w
  466.     subq.w    #2,d1
  467.     bcs    constdata2        ;残り1or2バイトでデータが終わる
  468.     bsr    out1wobj
  469.     addq.l    #2,(LOCATION,a6)
  470.     bra    constdata1
  471.  
  472. constdata2:
  473.     addq.w    #1,d1
  474.     bne    constdata3
  475.     bsr    out1wobj        ;偶数バイトでデータが終わる場合
  476.     addq.l    #2,(LOCATION,a6)
  477.     rts
  478.  
  479. constdata3:                ;奇数バイトでデータが終わる場合
  480.     lsr.w    #8,d0
  481.     bsr    out1bobj
  482.     addq.l    #1,(LOCATION,a6)
  483.     rts
  484.  
  485. ;----------------------------------------------------------------
  486. prnadv:                    ;36xx PRNファイルへの先行出力
  487.     tst.b    (MAKEPRN,a6)
  488.     bne    prnlineadv
  489.     rts
  490.  
  491. ;----------------------------------------------------------------
  492. linetop:                ;01xx 1行開始
  493.     tst.b    (MAKEPRN,a6)
  494.     bne    linetop5
  495.     cmp.b    #$02,d0
  496.     bcc    linetop1        ;マクロ展開中は行番号を変更しない
  497.     addq.l    #1,(LINENUM,a6)
  498. linetop1:
  499.     move.l    (LOCATION,a6),(LTOPLOC,a6)
  500.     tst.b    (MAKESYMDEB,a6)
  501.     bne    linetop7        ;'-g'スイッチが指定された場合
  502.     rts
  503.  
  504. linetop5:                ;リスティングを行う場合
  505.     bsr    prnline            ;前の1行を出力
  506.     move.w    (PAGEFLG,a6),d0
  507.     beq    linetop6
  508.     and.w    #$FF,d0
  509.     bsr    prnnextpage        ;改ページする
  510.     clr.w    (PAGEFLG,a6)
  511. linetop6:
  512.     bsr    getline
  513.     move.w    d0,(PRNLATR,a6)
  514.     bra    linetop1
  515.  
  516. linetop7:                ;デバッグ用行番号情報を出力する
  517.     tst.b    d0
  518.     bne    linetop9        ;.includeファイル中/マクロ展開中では出力しない
  519.     cmpi.b    #SECT_TEXT,(SECTION,a6)
  520.     bne    linetop9        ;.textセクション以外では出力しない
  521.     movea.l    (SCDLNPTR,a6),a0
  522.     adda.l    (LNOFST,a6),a0
  523.     move.l    (LOCATION,a6),(a0)+    ;ロケーション
  524.     move.l    (LINENUM,a6),d0
  525.     move.w    d0,(a0)+        ;行番号
  526.     addq.l    #6,(LNOFST,a6)
  527.     addq.l    #1,(NUMOFLN,a6)
  528. linetop9:
  529.     rts
  530.  
  531. ;----------------------------------------------------------------
  532. symdata:                ;02xx シンボル値
  533.     move.w    d0,d2
  534.     bsr    getdtsize
  535.     add.l    d0,(LOCATION,a6)
  536.     bsr    tmpreadsym        ;シンボル値を得る
  537.     bra    outobjexpr
  538.  
  539. ;----------------------------------------------------------------
  540. rpndata:                ;03xx 逆ポーランド式
  541.     move.w    d0,d2
  542.     bsr    getdtsize
  543.     add.l    d0,(LOCATION,a6)
  544.     bsr    tmpreadexpr        ;式の値を得る
  545.     bra    outobjexpr
  546.  
  547. ;----------------------------------------------------------------
  548. dispadr:                ;04xx (d,An)
  549.     bsr    tmpreadd0w
  550.     move.w    d0,d2
  551.     and.b    #3,d2            ;(ESZ_OPTビットをクリア)
  552.     beq    tmpreadsymex1        ;ディスプレースメントがサプレスされた
  553.     or.b    #ESZ_ADR,d2
  554.     addq.l    #2,(LOCATION,a6)
  555.     cmp.b    #ESZ_ADR|SZ_WORD,d2    ;ディスプレースメントサイズ
  556.     beq    dispadr_w
  557. dispadr_l:                ;ディスプレースメントがロングワードなので
  558.     addq.l    #4,(LOCATION,a6)    ;ベースディスプレースメント扱いになる
  559.     bra68    d0,dispadr_lerr
  560. ;ColdFireではベースディスプレースメントは不可
  561.     tst.b    (CPUTYPE2,a6)
  562.     bne    dispadr_lerr
  563.     move.w    #EXW_FULL|EXW_BDL|EXW_IS,d0    ;ロングワードの場合の拡張ワード
  564.     bsr    out1wobj        ;拡張ワードを出力する
  565.     move.w    d2,d0
  566. dispadr_w:
  567.     bsr    tmpreadsymex1
  568.     bra    outobjexpr
  569.  
  570. dispadr_lerr:                ;68000/68010なら32bitオフセットは使用できない
  571.     bsr    tmpreadsymex1        ;ディスプレースメントを読み飛ばす
  572.     bra    exprerr
  573.  
  574. ;----------------------------------------------------------------
  575. indexadr:                ;06xx (d,An,Rn)
  576.     bsr    tmpreadd0w        ;拡張ワードを読み込む
  577.     move.w    d0,d2
  578.     bsr    tmpreadd0w
  579.     exg.l    d0,d2
  580.     and.b    #3,d2            ;(ESZ_OPTビットをクリア)
  581.     or.b    #ESZ_ADR,d2
  582.     cmp.b    #ESZ_ADR|SZ_SHORT,d2    ;ディスプレースメントサイズ
  583.     beq    indexadr_s
  584.     cmp.b    #ESZ_ADR|SZ_LONG,d2
  585.     beq    indexadr_l
  586. indexadr_w:
  587.     addq.l    #4,(LOCATION,a6)
  588.     or.w    #EXW_FULL|EXW_BDW,d0
  589.     bra    indexadr_l1
  590.  
  591. indexadr_l:
  592.     addq.l    #6,(LOCATION,a6)
  593.     or.w    #EXW_FULL|EXW_BDL,d0
  594. indexadr_l1:
  595.     bsr    out1wobj        ;拡張ワードを出力する
  596.     bra    indexadr2
  597.  
  598. indexadr_s:
  599.     addq.l    #2,(LOCATION,a6)
  600.     lsr.w    #8,d0
  601.     bsr    out1bobj        ;拡張ワードの上位を出力する
  602. indexadr2:
  603.     move.w    d2,d0
  604.     bsr    tmpreadsymex1
  605.     bra    outobjexpr
  606.  
  607. ;----------------------------------------------------------------
  608. bdadr:                    ;09xx アドレスレジスタ間接ベースディスプレースメント
  609. odisp:                    ;0Bxx アウタディスプレースメント
  610.     bsr    tmpreadd0w
  611.     move.w    d0,d2
  612.     and.b    #3,d2            ;(ESZ_OPTビットをクリア)
  613.     beq    tmpreadsymex1        ;ディスプレースメントがサプレスされた
  614.     or.b    #ESZ_ADR,d2
  615.     addq.l    #2,(LOCATION,a6)
  616.     cmp.b    #ESZ_ADR|SZ_LONG,d2    ;ディスプレースメントサイズ
  617.     bne    bdadr_w
  618. bdadr_l:
  619.     addq.l    #2,(LOCATION,a6)
  620. bdadr_w:
  621.     bsr    tmpreadsymex1
  622.     bra    outobjexpr
  623.  
  624. ;----------------------------------------------------------------
  625. disppc:                    ;05xx (d,PC)
  626.     move.l    (LOCATION,a6),d5    ;(PC間接の基準アドレス)
  627.     bsr    tmpreadd0w
  628.     move.w    d0,d2
  629.     and.b    #3,d2            ;(ESZ_OPTビットをクリア)
  630.     addq.l    #2,(LOCATION,a6)
  631.     cmp.b    #SZ_WORD,d2        ;ディスプレースメントサイズ
  632.     beq    outpcdisp
  633.     addq.l    #4,(LOCATION,a6)
  634.     move.w    #EXW_FULL|EXW_BDL|EXW_IS,d0    ;ロングワードの場合の拡張ワード
  635.     bsr    out1wobj        ;拡張ワードを出力する
  636.     move.w    d2,d0
  637.     bra    outpcdisp
  638.  
  639. ;----------------------------------------------------------------
  640. dispopc:                ;32xx (d,OPC)
  641.     move.l    (LOCATION,a6),d5    ;(PC間接の基準アドレス)
  642.     bsr    tmpreadd0w
  643.     move.w    d0,d2
  644.     and.b    #3,d2            ;(ESZ_OPTビットをクリア)
  645.     addq.l    #2,(LOCATION,a6)
  646.     cmp.b    #SZ_WORD,d2        ;ディスプレースメントサイズ
  647.     beq    outpcdisp
  648.     addq.l    #2,(LOCATION,a6)    ;(d,PC)→xxxx.l
  649.     bsr    tmpreadsymex1
  650.     bra    outobjexpr
  651.  
  652. ;----------------------------------------------------------------
  653. indexpc:                ;07xx (d,PC,Rn)
  654.     move.l    (LOCATION,a6),d5    ;(PC間接の基準アドレス)
  655.     bsr    tmpreadd0w        ;拡張ワードを読み込む
  656.     move.w    d0,d2
  657.     bsr    tmpreadd0w
  658.     exg.l    d0,d2
  659.     and.b    #3,d2            ;(ESZ_OPTビットをクリア)
  660.     cmp.b    #SZ_SHORT,d2        ;ディスプレースメントサイズ
  661.     beq    indexpc_s
  662.     cmp.b    #SZ_LONG,d2
  663.     beq    indexpc_l
  664. indexpc_w:
  665.     addq.l    #4,(LOCATION,a6)
  666.     or.w    #EXW_FULL|EXW_BDW,d0
  667.     bra    indexpc_l1
  668.  
  669. indexpc_l:
  670.     addq.l    #6,(LOCATION,a6)
  671.     or.w    #EXW_FULL|EXW_BDL,d0
  672. indexpc_l1:
  673.     bsr    out1wobj        ;拡張ワードを出力する
  674.     bra    indexpc2
  675.  
  676. indexpc_s:
  677.     addq.l    #2,(LOCATION,a6)
  678.     lsr.w    #8,d0
  679.     bsr    out1bobj        ;拡張ワードの上位を出力する
  680. indexpc2:
  681.     move.w    d2,d0
  682.     bra    outpcdisp
  683.  
  684. ;----------------------------------------------------------------
  685. bdpc:                    ;0Axx PC間接ベースディスプレースメント
  686.     move.l    (LOCATION,a6),d5
  687.     subq.l    #2,d5            ;(PC間接の基準アドレス(拡張ワードのアドレス))
  688.     bsr    tmpreadd0w
  689.     move.w    d0,d2
  690.     and.b    #3,d2            ;(ESZ_OPTビットをクリア)
  691.     beq    tmpreadsymex1        ;ディスプレースメントがサプレスされた
  692.     addq.l    #2,(LOCATION,a6)
  693.     cmp.b    #SZ_LONG,d2        ;ディスプレースメントサイズ
  694.     bne    outpcdisp
  695.     addq.l    #2,(LOCATION,a6)
  696.     bra    outpcdisp
  697.  
  698. ;----------------------------------------------------------------
  699. linkcmd:                ;33xx link.w/.l
  700.     move.l    (LOCATION,a6),d5
  701.     addq.l    #2,d5
  702.     move.l    d5,(LCURLOC,a6)        ;('$'のアドレス)
  703.     move.w    d0,d3
  704.     bsr    tmpreadd0w
  705.     move.w    d0,d2
  706.     and.b    #3,d2            ;(ESZ_OPTビットをクリア)
  707.     cmp.b    #SZ_WORD,d2        ;ディスプレースメントサイズ
  708.     beq    link_w
  709. link_l:
  710.     addq.l    #2,(LOCATION,a6)
  711.     or.w    #$4808,d3        ;link.lの命令コード
  712.     bra    link9
  713.  
  714. link_w:
  715.     or.w    #$4E50,d3        ;link.wの命令コード
  716. link9:
  717.     move.w    d3,d0
  718.     bsr    out1wobj        ;命令コードを出力する
  719.     addq.l    #4,(LOCATION,a6)
  720.     move.w    d2,d0
  721.     bsr    tmpreadsymex1
  722.     bra    outobjexpr
  723.  
  724. ;----------------------------------------------------------------
  725. jbracmd:                ;31xx jbra/jbsr/jb<cc>
  726.     move.l    (LOCATION,a6),d5
  727.     addq.l    #2,d5            ;(ディスプレースメントの基準アドレス)
  728.     bsr    tmpreadd0w        ;命令コードを読み込む
  729.     move.w    d0,d3
  730.     bsr    tmpreadd0w
  731.     move.w    d0,d2
  732.     and.b    #3,d2            ;(ESZ_OPTビットをクリア)
  733.     beq    tmpreadsymex1        ;ブランチ命令がサプレスされた
  734.     cmp.b    #SZ_LONG,d2        ;ディスプレースメントサイズ
  735.     bne    bracmd1            ;.lでなければbra/bsr/b<cc>
  736.     move.w    #$4EB9,d1        ;(jsrの命令コード)
  737.     cmp.w    #$6100,d3
  738.     beq    jbracmd9        ;bsr → jsr
  739.     bcs    jbracmd8        ;bra → jmp
  740.     eori.w    #$0106,d3        ;b<cc> → b</cc> $+8 & jmp
  741.     move.w    d3,d0
  742.     bsr    out1wobj        ;命令コードを出力する
  743.     addq.l    #2,(LOCATION,a6)
  744. jbracmd8:
  745.     move.w    #$4EF9,d1        ;(jmpの命令コード)
  746. jbracmd9:
  747.     move.w    d1,d0
  748.     bsr    out1wobj        ;命令コードを出力する
  749.     addq.l    #6,(LOCATION,a6)
  750.     move.w    d2,d0
  751.     bsr    tmpreadsymex1
  752.     tst.w    d0            ;値のセクション
  753.     beq    ilrelerr_const        ;定数ならエラー
  754.     bra    outobjexpr
  755.  
  756. ;----------------------------------------------------------------
  757. bracmd:                    ;0Cxx bra/bsr/b<cc>.s/.w/.l
  758.     move.l    (LOCATION,a6),d5
  759.     addq.l    #2,d5            ;(ディスプレースメントの基準アドレス)
  760.     bsr    tmpreadd0w        ;命令コードを読み込む
  761.     move.w    d0,d3
  762.     bsr    tmpreadd0w
  763.     move.w    d0,d2
  764.     and.b    #3,d2            ;(ESZ_OPTビットをクリア)
  765.     beq    tmpreadsymex1        ;ブランチ命令がサプレスされた
  766. bracmd1:
  767.     cmp.b    #SZ_SHORT,d2        ;ディスプレースメントサイズ
  768.     beq    bracmd_s
  769.     cmp.b    #SZ_WORD,d2
  770.     beq    bracmd_w_test
  771. bracmd_l:
  772.     addq.l    #2,(LOCATION,a6)
  773.     st.b    d3            ;下位ワードが$FFならロングワードブランチ
  774. bracmd_w:                ;下位ワードが$00ならワードブランチ
  775.     move.w    d3,d0
  776.     bsr    out1wobj        ;命令コードを出力する
  777.     addq.l    #4,(LOCATION,a6)
  778.     move.w    d2,d0
  779.     bra    outpcbra
  780.  
  781. bracmd_s:
  782.     addq.l    #2,(LOCATION,a6)
  783.     move.w    d3,d0
  784.     lsr.w    #8,d0
  785.     bsr    out1bobj        ;命令コードを出力する
  786.     move.w    d2,d0
  787.     bra    outpcbra
  788.  
  789. ;ここはjbsrも使う
  790. bracmd_w_test:
  791.     tst.b    (OPTBSR,a6)
  792.     beq    bracmd_w        ;直後へのbsrを最適化しない
  793.     cmp.b    #SZ_WORD|$40,d0
  794.     bne    bracmd_w        ;直後へのbsrではない
  795.     addq.l    #4,(LOCATION,a6)
  796.     move.w    d2,d0
  797.     st.b    d3
  798.     bsr    tmpreadsymex1
  799. ;アドレス値以外や他のセクションへのオフセットは最適化の対象ではないので,
  800. ;直後へのbsrのフラグが立たず,ここにはこない
  801. ;    move.w    d0,d4            ;値のセクション
  802. ;    beq    ilrelerr_const        ;定数ならエラー
  803. ;    cmp.b    SECTION(a6),d4
  804. ;    bne    bracmd_w_rsect        ;他のセクションへのオフセット
  805.     sub.l    d5,d1            ;現在のアドレスからの相対値
  806.     move.l    d1,d0
  807.     subq.l    #2,d0
  808.     bne    bracmd_w_bsr        ;alignなどの影響で間があいてしまっている
  809. bracmd_w_pea:
  810.     move.l    #$487A_0002,d0
  811.     bsr    out1lobj        ;pea (2,pc)
  812.     bra    prnpccode
  813.  
  814. ;直後へのbsrがalignのパディングを跨ぐときは,peaに置き換えてはならない.
  815. ;peaに変えてしまうと,alignのパディング部分を実行するタイミングが変化してしまい,
  816. ;alignのパディングが何か意味のあるコードだった場合に問題が生じる可能性がある.
  817. bracmd_w_bsr:
  818.     move.w    #$6100,d0
  819.     bsr    out1wobj        ;bsr.w
  820.     bra    outpcdisp_w
  821.  
  822. ;bracmd_w_rsect:
  823. ;    move.w    #$6100,d0
  824. ;    bsr    out1wobj
  825. ;    bra    outpcdisp5
  826.  
  827. ;----------------------------------------------------------------
  828. cpbracmd:                ;0Dxx cpb<cc>.w/.l
  829.     move.l    (LOCATION,a6),d5
  830.     addq.l    #2,d5            ;(ディスプレースメントの基準アドレス)
  831.     bsr    tmpreadd0w        ;命令コードを読み込む
  832.     move.w    d0,d3
  833.     bsr    tmpreadd0w
  834.     move.w    d0,d2
  835.     and.b    #3,d2            ;(ESZ_OPTビットをクリア)
  836.     beq    tmpreadsymex1        ;ブランチ命令がサプレスされた
  837.     cmp.b    #SZ_WORD,d2        ;ディスプレースメントサイズ
  838.     beq    cpbracmd_w
  839. cpbracmd_l:
  840.     addq.l    #2,(LOCATION,a6)
  841.     or.w    #$0040,d3        ;b6=1ならロングワードブランチ
  842. cpbracmd_w:                ;b6=0ならワードブランチ
  843.     move.w    d3,d0
  844.     bsr    out1wobj        ;命令コードを出力する
  845.     addq.l    #4,(LOCATION,a6)
  846.     move.w    d2,d0
  847. ;    bra    outpcbra
  848.  
  849. ;----------------------------------------------------------------
  850. ;    PC間接オフセットを出力する
  851. ;    in :d0.w=T_SYMBOL or T_RPN/d2.b=サイズ/d5.l=基準アドレス
  852. outpcbra:                ;bra/cpbra命令
  853.     st.b    d3
  854.     bsr    tmpreadsymex1
  855.     move.w    d0,d4            ;値のセクション
  856.     bne    outpcdisp0
  857.     bra    ilrelerr_const        ;定数ならエラー
  858.  
  859. outpcdisp:                ;PC間接アドレッシング
  860.     sf.b    d3
  861.     bsr    tmpreadsymex1
  862.     move.w    d0,d4            ;値のセクション
  863.     beq    outpcdisp1        ;定数の場合
  864. outpcdisp0:
  865.     cmp.b    (SECTION,a6),d4
  866.     bne    outpcdisp5        ;他のセクションへのオフセット
  867.     sub.l    d5,d1            ;現在のアドレスからの相対値
  868. outpcdisp1:
  869.     cmp.b    #SZ_SHORT,d2        ;ディスプレースメントサイズ
  870.     beq    outpcdisp_s
  871.     cmp.b    #SZ_LONG,d2
  872.     beq    outpcdisp_l
  873. outpcdisp_w:
  874.     move.l    d1,d0
  875.     ext.l    d0
  876.     cmp.l    d1,d0
  877.     bne    ilrelerr_outside    ;16bitオフセットの範囲外
  878.     bsr    out1wobj
  879.     bra    prnpccode
  880.  
  881. outpcdisp_l:
  882.     bra68    d0,ilrelerr_outside    ;68000/68010なら32bitオフセットは使用できない
  883. ;ColdFireでは32ビットのオフセットは不可
  884.     tst.b    (CPUTYPE2,a6)
  885.     bne    ilrelerr_outside
  886.     move.l    d1,d0
  887.     bsr    out1lobj
  888.     bra    prnpccode
  889.  
  890. outpcdisp_s:
  891.     move.l    d1,d0
  892.     ext.w    d0
  893.     ext.l    d0
  894.     cmp.l    d1,d0
  895.     bne    ilrelerr_outside    ;8bitオフセットの範囲外
  896.     tst.b    d3
  897.     beq    outpcdisp_s1
  898.     tst.b    d1            ;ブランチオフセットの場合
  899.     beq    ilrelerr_outside    ;(オフセットが$00ならエラー)
  900.     cmp.b    #$FF,d1
  901.     beq    ilrelerr_outside    ;(オフセットが$FFならエラー)
  902. outpcdisp_s1:
  903.     bsr    out1bobj
  904.     bra    prnpccode
  905.  
  906. outpcdisp5:                ;他のセクションへのオフセット
  907.     bsr    prnextcode
  908.     cmp.w    #SECT_XREF,d4
  909.     beq    outpcdisp8        ;外部参照値へのオフセット
  910.     bhi    outpcdisp7
  911.     bsr    prnopccode
  912. outpcdisp7:
  913.     bsr    outobjrpn        ;逆ポーランド式を出力
  914.     move.w    #$8000,d0        ;現在のロケーションカウンタ値をスタックに積む
  915.     move.b    (SECTION,a6),d0
  916.     bsr    outobj1w
  917.     move.l    d5,d0
  918.     bsr    wrtd0l
  919.     move.w    #$A00F,d0        ;スタック内の減算(オフセットを求める)
  920.     bsr    wrtd0w
  921.  
  922.     move.w    #$9300,d0
  923.     cmp.b    #SZ_SHORT,d2
  924.     beq    wrtd0w
  925.     move.w    #$9900,d0
  926.     cmp.b    #SZ_WORD,d2
  927.     beq    wrtd0w
  928.     move.w    #$9200,d0
  929.     bra    wrtd0w
  930.  
  931. outpcdisp8:                ;外部参照値へのオフセット
  932.     move.w    #$6B00,d0        ;ショートオフセット
  933.     cmp.b    #SZ_SHORT,d2
  934.     beq    outpcdisp9
  935.     move.w    #$6500,d0        ;ワードオフセット
  936.     cmp.b    #SZ_WORD,d2
  937.     bne    outpcdisp7        ;(ロングワードオフセットがないため)
  938. outpcdisp9:
  939.     move.b    (SECTION,a6),d0
  940.     bsr    outobj1w
  941.     move.l    d5,d0
  942.     bsr    wrtd0l
  943.     move.w    d1,d0            ;外部参照番号
  944.     bra    wrtd0w
  945.  
  946. ;----------------------------------------------------------------
  947. ;    PC間接データをPRNファイルに出力する
  948. prnpccode:
  949.     tst.b    (MAKEPRN,a6)
  950.     beq    prnpccode9
  951.     movea.l    (PRNLPTR,a6),a0
  952.     move.b    #'_',(a0)+
  953.     move.l    d1,d0
  954.     add.l    d5,d0
  955.     bsr    convhex8
  956.     move.b    #-1,(a0)+
  957.     move.l    a0,(PRNLPTR,a6)
  958. prnpccode9:
  959.     rts
  960.  
  961. ;----------------------------------------------------------------
  962. ;    他のセクションへのオフセットをPRNファイルに出力する
  963. prnopccode:
  964.     tst.b    (MAKEPRN,a6)
  965.     beq    prnopccode9
  966.     movea.l    (PRNLPTR,a6),a0        ;'_(xx)xxxxxxxx'
  967.     move.b    #'_',(a0)+
  968.     move.b    #'(',(a0)+
  969.     move.b    d4,d0
  970.     bsr    convhex2        ;セクション番号
  971.     move.b    #')',(a0)+
  972.     move.l    d1,d0
  973.     bsr    convhex8
  974.     move.b    #-1,(a0)+
  975.     move.l    a0,(PRNLPTR,a6)
  976. prnopccode9:
  977.     rts
  978.  
  979. ;----------------------------------------------------------------
  980. coderpn:                ;0Fxx 命令コード埋め込み式データ
  981.     move.w    d0,d1
  982.     addq.l    #2,(LOCATION,a6)
  983.     bsr    tmpreadd0w        ;命令コードを読み込む
  984.     move.w    d0,d3
  985.     subq.w    #1,d1
  986.     bmi    cmdimm8            ;TCR_IMM8
  987.     beq    cmdimm8s        ;TCR_IMM8S
  988.     subq.w    #2,d1
  989.     bmi    cmdmoveq        ;TCR_MOVEQ
  990.     subq.w    #1,d1
  991.     bmi    cmdtrap            ;TCR_TRAP
  992.     subq.w    #1,d1
  993.     bmi    cmdbkpt            ;TCR_BKPT
  994. ;    bra    cmdimm3q        ;TCR_IMM3Q
  995.  
  996. cmdimm3q:                ;mov3q
  997.     bsr    tmpreadsymex        ;後続のデータを読み込む
  998.     tst.w    d0
  999.     bne    cmdimmer        ;定数でない場合
  1000.     tst.l    d1
  1001.     beq    ilquickerr_mov3q    ;-1,1~7の範囲外
  1002.     bpl    cmdimm81
  1003.     addq.l    #1,d1
  1004.     bra    cmdimm81
  1005.  
  1006. cmdimm8s:                ;sftrot
  1007.     bsr    tmpreadsymex        ;後続のデータを読み込む
  1008.     tst.w    d0
  1009.     bne    cmdimmer        ;定数でない場合
  1010.     subq.l    #1,d1
  1011.     cmp.l    #8,d1
  1012.     bcc    ilquickerr_sftrot    ;クイックサイズの範囲外
  1013.     bra    cmdimm82
  1014.  
  1015. cmdimm8:                ;subq,addq,...
  1016.     bsr    tmpreadsymex        ;後続のデータを読み込む
  1017.     tst.w    d0
  1018.     bne    cmdimmer        ;定数でない場合
  1019.     subq.l    #1,d1
  1020. cmdimm81:
  1021.     cmp.l    #8,d1
  1022.     bcc    ilquickerr_addsubq    ;クイックサイズの範囲外
  1023. cmdimm82:
  1024.     addq.w    #1,d1
  1025.     and.w    #$0007,d1
  1026.     ror.w    #7,d1
  1027.     or.w    d3,d1            ;命令コードと合成
  1028.     move.w    d1,d0
  1029.     bra    out1wobj
  1030.  
  1031. cmdimmer:
  1032.     cmp.w    #SECT_COMM,d0
  1033.     bls    ilvalueerr        ;アドレス値ならエラー
  1034.     bra    featureerr_xref        ;外部参照値は未サポート
  1035.  
  1036. cmdmoveq:                ;moveq
  1037.     bsr    tmpreadsymex        ;後続のデータを読み込む
  1038.     tst.w    d0
  1039.     bne    cmdmoveq5        ;定数でない場合
  1040.     move.l    d1,d0
  1041.     ext.w    d0
  1042.     ext.l    d0
  1043.     cmp.l    d1,d0
  1044.     beq    cmdmoveq1        ;-$80~$7Fの場合
  1045.     cmp.l    #$100,d1
  1046.     bcc    ilquickerr_moveq    ;$100以上はエラー
  1047. cmdmoveq1:
  1048.     exg.l    d0,d3
  1049.     move.b    d3,d0            ;命令コードと合成
  1050.     bra    out1wobj
  1051.  
  1052. cmdmoveq5:
  1053.     cmp.w    #SECT_COMM,d0
  1054.     bls    ilvalueerr        ;アドレス値ならエラー
  1055.     exg.l    d0,d3
  1056.     lsr.w    #8,d0
  1057.     bsr    out1bobj        ;命令コードを出力
  1058.     exg.l    d0,d3
  1059.     moveq.l    #SZ_SHORT,d2
  1060.     bra    outobjexpr
  1061.  
  1062. cmdtrap:                ;trap
  1063.     bsr    tmpreadsymex        ;後続のデータを読み込む
  1064.     tst.w    d0
  1065.     bne    cmdimmer        ;定数でない場合
  1066.     cmp.l    #16,d1
  1067.     bcc    ilvalueerr        ;値は0~15まで
  1068.     or.w    d3,d1            ;命令コードと合成
  1069.     move.w    d1,d0
  1070.     bra    out1wobj
  1071.  
  1072. cmdbkpt:                ;bkpt
  1073.     bsr    tmpreadsymex        ;後続のデータを読み込む
  1074.     tst.w    d0
  1075.     bne    cmdimmer        ;定数でない場合
  1076.     cmp.l    #8,d1
  1077.     bcc    ilvalueerr        ;値は0~8まで
  1078.     or.w    d3,d1            ;命令コードと合成
  1079.     move.w    d1,d0
  1080.     bra    out1wobj
  1081.  
  1082. ;----------------------------------------------------------------
  1083. bitfield:                ;11xx ビットフィールド式データ
  1084.     move.w    d0,d1
  1085.     addq.l    #2,(LOCATION,a6)
  1086.     bsr    tmpreadd0w        ;命令コードを読み込む
  1087.     move.w    d0,d3
  1088.     subq.w    #1,d1
  1089.     bpl    bitfield1
  1090.     bsr    bitfgetof        ;TBF_OF(オフセットが式)
  1091.     move.w    d3,d0
  1092.     bra    out1wobj
  1093.  
  1094. bitfield1:
  1095.     subq.w    #1,d1
  1096.     bpl    bitfield2
  1097.     bsr    bitfgetwd        ;TBF_WD(幅が式)
  1098.     move.w    d3,d0
  1099.     bra    out1wobj
  1100.  
  1101. bitfield2:
  1102.     bsr    bitfgetof        ;TBF_OFWD(オフセット・幅とも式)
  1103.     bsr    bitfgetwd
  1104.     move.w    d3,d0
  1105.     bra    out1wobj
  1106.  
  1107. bitfgetof:                ;オフセットを得る
  1108.     bsr    tmpreadsymex        ;後続のデータを読み込む
  1109.     tst.w    d0
  1110.     bne    cmdimmer        ;定数でない場合
  1111.     cmp.l    #31,d1
  1112.     bhi    ilvalueerr        ;オフセット値は0~31
  1113.     lsl.w    #6,d1
  1114.     or.w    d1,d3
  1115.     rts
  1116.  
  1117. bitfgetwd:                ;幅を得る
  1118.     bsr    tmpreadsymex        ;後続のデータを読み込む
  1119.     tst.w    d0
  1120.     bne    cmdimmer        ;定数でない場合
  1121.     tst.l    d1
  1122.     beq    ilvalueerr        ;幅は1~32
  1123.     cmp.l    #32,d1
  1124.     bhi    ilvalueerr
  1125.     and.w    #31,d1
  1126.     or.w    d1,d3
  1127.     rts
  1128.  
  1129. ;----------------------------------------------------------------
  1130. dscmd:                    ;12xx .ds
  1131.     bsr    tmpreadd0l
  1132.     add.l    d0,(LOCATION,a6)
  1133.     tst.b    (ISOBJOUT,a6)
  1134.     bne    dscmd1
  1135.     add.l    d0,(DSBSIZE,a6)
  1136. dscmd1:
  1137.     rts
  1138.  
  1139. ;----------------------------------------------------------------
  1140. dcbcmd:                    ;13xx .dcb
  1141.     bsr    tmpreadd0w        ;データの個数
  1142.     move.w    d0,d3
  1143.     bsr    tmpreadd0w
  1144.     move.w    d0,d2
  1145.     bsr    getdtsize        ;データサイズを得る
  1146.     move.w    d3,d4
  1147.     addq.w    #1,d4
  1148.     mulu.w    d4,d0            ;生成するデータのサイズ
  1149.     add.l    d0,(LOCATION,a6)    ;必要なサイズだけカウンタを進める
  1150.     move.l    d0,d5
  1151.     move.w    d2,d0
  1152.     bsr    tmpreadsymex1
  1153.  
  1154.     tst.b    (MAKEPRN,a6)
  1155.     beq    dcbcmd1
  1156.     cmp.l    #128,d5
  1157.     bcc    dcbcmd5
  1158. dcbcmd1:
  1159.     movem.l    d0-d3,-(sp)
  1160.     bsr    outobjexpr        ;データを出力
  1161.     movem.l    (sp)+,d0-d3
  1162.     dbra    d3,dcbcmd1
  1163.     rts
  1164.  
  1165. dcbcmd5:                ;PRNファイル出力時、データが128bytes以上の場合
  1166.     movea.l    (PRNLPTR,a6),a0
  1167.     lea.l    (dcb_msg,pc),a1
  1168.     bsr    strcpy            ;'value= '
  1169.     move.l    a0,(PRNLPTR,a6)
  1170. dcbcmd6:
  1171.     movem.l    d0-d3,-(sp)
  1172.     bsr    outobjexpr        ;データを出力
  1173.     sf.b    (MAKEPRN,a6)        ;(PRNファイルに出力されるのは最初の1つだけ)
  1174.     movem.l    (sp)+,d0-d3
  1175.     dbra    d3,dcbcmd6
  1176. dcbcmd65:
  1177.     st.b    (MAKEPRN,a6)
  1178.     movea.l    (PRNLPTR,a6),a0
  1179.     lea.l    (dcb_msg2,pc),a1
  1180.     move.b    #-1,(a0)+        ;(PRNファイルコード部を改行)
  1181.     bsr    strcpy            ;'count= '
  1182.     move.l    d5,d0            ;出力バイト数
  1183.     cmp.l    #$FFFF,d0
  1184.     bhi    dcbcmd7
  1185.     bsr    convhex4
  1186.     bra    dcbcmd8
  1187.  
  1188. dcbcmd7:
  1189.     bsr    convhex8
  1190. dcbcmd8:
  1191.     bsr    strcpy            ;'bytes'
  1192.     move.b    #-1,(a0)+
  1193.     move.l    a0,(PRNLPTR,a6)
  1194.     rts
  1195.  
  1196. dcb_msg:    .dc.b    'value= ',0
  1197. dcb_msg2:    .dc.b    'count= ',0,'bytes',0
  1198.     .even
  1199.  
  1200. ;----------------------------------------------------------------
  1201. fdcbcmd:                ;30xx .dcb(浮動小数点実数)
  1202.     move.w    d0,d1            ;データ長
  1203.     move.w    d0,d4
  1204.     bsr    tmpreadd0w        ;データの個数
  1205.     move.w    d0,d3
  1206.     ext.l    d0
  1207.     addq.l    #1,d0
  1208.     add.l    d0,d0
  1209.     add.l    d0,d0
  1210.     moveq.l    #0,d2
  1211. fdcbcmd1:
  1212.     add.l    d0,d2
  1213.     dbra    d1,fdcbcmd1
  1214.     add.l    d2,(LOCATION,a6)        ;必要なサイズだけカウンタを進める
  1215.     lea.l    (OPRBUF,a6),a2
  1216.     movea.l    a2,a1
  1217.     moveq.l    #3-1,d1
  1218. fdcbcmd2:
  1219.     bsr    tmpreadd0l        ;データを読み出す
  1220.     move.l    d0,(a1)+
  1221.     dbra    d1,fdcbcmd2
  1222.     tst.b    (MAKEPRN,a6)
  1223.     beq    fdcbcmd3
  1224.     cmp.l    #128,d2
  1225.     bcc    fdcbcmd5
  1226. fdcbcmd3:
  1227.     move.w    d4,d1
  1228.     movea.l    a2,a1
  1229. fdcbcmd4:
  1230.     move.l    (a1)+,d0
  1231.     bsr    out1lobj        ;データを出力
  1232.     dbra    d1,fdcbcmd4
  1233.     dbra    d3,fdcbcmd3
  1234.     rts
  1235.  
  1236. fdcbcmd5:                ;PRNファイル出力時、データが128bytes以上の場合
  1237.     movea.l    (PRNLPTR,a6),a0
  1238.     lea.l    (dcb_msg,pc),a1
  1239.     bsr    strcpy            ;'value= '
  1240.     move.l    a0,(PRNLPTR,a6)
  1241.     move.l    d2,d5            ;出力バイト数
  1242. fdcbcmd6:
  1243.     move.w    d4,d1
  1244.     movea.l    a2,a1
  1245. fdcbcmd7:
  1246.     move.l    (a1)+,d0
  1247.     bsr    out1lobj        ;データを出力
  1248.     dbra    d1,fdcbcmd7
  1249.     sf.b    (MAKEPRN,a6)        ;(PRNファイルに出力されるのは最初の1つだけ)
  1250.     dbra    d3,fdcbcmd6
  1251.     bra    dcbcmd65
  1252.  
  1253. ;----------------------------------------------------------------
  1254. aligncmd:                ;14xx アラインメントの調整
  1255.     moveq.l    #1,d1
  1256.     lsl.l    d0,d1
  1257.     subq.l    #1,d1            ;d1=2^d0 - 1
  1258.     move.l    (LOCATION,a6),d2
  1259.     move.l    d2,d0
  1260.     add.l    d1,d2
  1261.     not.l    d1
  1262.     and.l    d2,d1
  1263.     move.l    d1,(LOCATION,a6)
  1264.     sub.l    d0,d1
  1265.     lsr.w    #1,d1
  1266.     bcc    aligncmd1
  1267.     moveq.l    #0,d0            ;まず2バイト境界を調整する
  1268.     bsr    out1bobj
  1269. aligncmd1:
  1270.     bsr    tmpreadd0w        ;パディング値を読み込む
  1271.     bra    aligncmd3
  1272.  
  1273. aligncmd2:
  1274.     bsr    out1wobj
  1275. aligncmd3:
  1276.     dbra    d1,aligncmd2
  1277.     bra    tmpreadd0w        ;パディング長は読み飛ばす
  1278.  
  1279. ;----------------------------------------------------------------
  1280. sectchg:                ;15xx セクション変更
  1281.     bsr    chgsection
  1282. ;offsymでシンボルなしのときも0になってしまうが
  1283. ;パス2以降では二重定義エラーは出ないはずなので無視する
  1284.     sf.b    (OFFSYMMOD,a6)
  1285.     move.l    (LOCATION,a6),(LTOPLOC,a6)    ;prnlineで使う
  1286.     sf.b    (ISOBJOUT,a6)
  1287.     or.w    #$2000,d0        ;20xx 0000 0000 :セクション変更
  1288.     bsr    outobj1w
  1289.     moveq.l    #0,d0
  1290.     bra    wrtd0l
  1291.  
  1292. ;----------------------------------------------------------------
  1293. offsymcmd:                ;37xx .offsym
  1294.     clr.w    d0
  1295.     bsr    chgsection        ;offsetセクションに変更
  1296.     tst.l    (DSBSIZE,a6)
  1297.     beq    offsymcmd1
  1298.     bsr    outdsb
  1299. offsymcmd1:
  1300.     bsr    flushobj        ;オブジェクトバッファをフラッシュ
  1301.     st.b    (ISOBJOUT,a6)        ;以後のオブジェクト出力を抑制
  1302.     bsr    tmpreadd0l        ;初期値を読み出す
  1303.     move.l    d0,(OFFSYMVAL,a6)
  1304.     bsr    tmpreadd0l        ;シンボルを読み出す
  1305.     move.l    d0,(OFFSYMSYM,a6)
  1306.     bsr    tmpreadd0l        ;仮シンボルを読み出す
  1307.     move.l    d0,(OFFSYMTMP,a6)
  1308.     move.b    #1,(OFFSYMMOD,a6)    ;offsymでシンボルあり
  1309.     clr.l    (LOCATION,a6)
  1310.     clr.l    (LTOPLOC,a6)        ;prnlineで使う
  1311.     rts
  1312.  
  1313. ;----------------------------------------------------------------
  1314. ofstcmd:                ;16xx .offset
  1315.     clr.w    d0
  1316.     bsr    chgsection        ;offsetセクションに変更
  1317.     tst.l    (DSBSIZE,a6)
  1318.     beq    ofstcmd1
  1319.     bsr    outdsb
  1320. ofstcmd1:
  1321.     bsr    flushobj        ;オブジェクトバッファをフラッシュ
  1322.     st.b    (ISOBJOUT,a6)        ;以後のオブジェクト出力を抑制
  1323.     bsr    tmpreadd0l
  1324.     move.l    d0,(LOCATION,a6)
  1325.     rts
  1326.  
  1327. ;----------------------------------------------------------------
  1328. equconst:                ;17xx 定数の.equ/.set
  1329.     bsr    tmpreadd0l        ;シンボルへのポインタ
  1330.     move.l    d0,a0
  1331.     bsr    tmpreadd0l        ;シンボル値
  1332.     move.l    d0,(SYM_VALUE,a0)
  1333.     clr.w    (SYM_SECTION,a0)    ;(SYM_ORGNUM)
  1334.     move.l    d0,d1
  1335.     moveq.l    #SECT_ABS,d0
  1336. equconst1:
  1337.     tst.b    (MAKEPRN,a6)
  1338.     beq    equconst9
  1339.     movea.l    (PRNLPTR,a6),a0
  1340.     move.b    #'=',(a0)+
  1341.     tst.b    d0
  1342.     beq    equconst2
  1343.     move.b    #'(',(a0)+
  1344.     bsr    convhex2
  1345.     move.b    #')',(a0)+
  1346. equconst2:
  1347.     move.l    d1,d0
  1348.     bsr    convhex8
  1349.     move.l    a0,(PRNLPTR,a6)
  1350. equconst9:
  1351.     rts
  1352.  
  1353. ;----------------------------------------------------------------
  1354. equexpr:                ;18xx 式・アドレスの.equ/.set
  1355.     bsr    tmpreadd0l        ;シンボルへのポインタ
  1356.     move.l    d0,-(sp)
  1357.     bsr    tmpreadsymex
  1358.     movea.l    (sp)+,a0
  1359.     cmp.w    #$00FF,d0
  1360.     bcc    equexpr9        ;シンボル値が確定しない
  1361.     move.b    d0,(SYM_SECTION,a0)
  1362.     move.l    d1,(SYM_VALUE,a0)
  1363.     move.b    #SA_DEFINE,(SYM_ATTRIB,a0)
  1364.     bra    equconst1
  1365.  
  1366. equexpr9:
  1367.     clr.b    (SYM_SECTION,a0)
  1368.     clr.l    (SYM_VALUE,a0)
  1369.     move.b    #SA_DEFINE,(SYM_ATTRIB,a0)
  1370.     bra    iloprerr_not_fixed    ;値が確定しないのでエラー
  1371.  
  1372. ;----------------------------------------------------------------
  1373. fequset:                ;2Exx .fequ/.fset
  1374.     move.w    d0,d1
  1375.     bsr    tmpreadd0l        ;シンボルへのポインタ
  1376.     movea.l    d0,a1
  1377.     move.b    d1,(SYM_FSIZE,a1)    ;シンボルのサイズ
  1378.     movea.l    (SYM_FVPTR,a1),a0    ;シンボル値へのポインタ
  1379.     moveq.l    #3-1,d1
  1380. fequset1:
  1381.     bsr    tmpreadd0l
  1382.     move.l    d0,(a0)+        ;シンボル値を読み込む
  1383.     dbra    d1,fequset1
  1384.     tst.b    (MAKEPRN,a6)
  1385.     beq    fequcmd9
  1386.     movea.l    (PRNLPTR,a6),a0
  1387.     move.b    #'=',(a0)+
  1388.     moveq.l    #0,d0
  1389.     move.b    (SYM_FSIZE,a1),d0    ;シンボルのサイズ
  1390.     movea.l    (SYM_FVPTR,a1),a2    ;シンボル値へのポインタ
  1391.     bsr    getfplen        ;データ長を得る
  1392. fequcmd2:
  1393.     move.l    (a2)+,d0
  1394.     bsr    convhex8
  1395.     dbra    d1,fequcmd2
  1396.     move.l    a0,(PRNLPTR,a6)
  1397. fequcmd9:
  1398.     rts
  1399.  
  1400. ;----------------------------------------------------------------
  1401. xdefcmd:                ;19xx .xdef
  1402.     bsr    tmpreadd0l        ;シンボルへのポインタ
  1403.     movea.l    d0,a1
  1404.     tst.b    (SYM_ATTRIB,a1)        ;(cmpi.b #SA_UNDEF,(SYM_ATTRIB,a1))
  1405.     beq    xdefcmd01        ;xdefされたシンボルが未定義
  1406.     rts
  1407.  
  1408. xdefcmd01:
  1409. ;ローカルシンボルは外部定義できないので考えなくてよい
  1410.     move.l    a1,(ERRMESSYM,a6)
  1411.     bra    undefsymerr
  1412.  
  1413. ;----------------------------------------------------------------
  1414. prnctrl:                ;1Axx リスト出力制御
  1415.     subq.w    #1,d0
  1416.     beq    prnlist
  1417.     subq.w    #1,d0
  1418.     beq    prnnlist
  1419.     subq.w    #1,d0
  1420.     beq    prnsall
  1421.     subq.w    #1,d0
  1422.     beq    prnlall
  1423.     rts
  1424.  
  1425. prnlist:                ;.list
  1426.     sf.b    (ISNLIST,a6)
  1427.     rts
  1428.  
  1429. prnnlist:                ;.nlist
  1430.     st.b    (ISNLIST,a6)
  1431.     rts
  1432.  
  1433. prnsall:                ;.sall
  1434.     sf.b    (ISLALL,a6)
  1435.     rts
  1436.  
  1437. prnlall:                ;.lall
  1438.     st.b    (ISLALL,a6)
  1439.     rts
  1440.  
  1441. ;----------------------------------------------------------------
  1442. pagecmd:                ;1Bxx .page
  1443.     or.w    #$FF00,d0
  1444.     move.w    d0,(PAGEFLG,a6)
  1445.     rts
  1446.  
  1447. ;----------------------------------------------------------------
  1448. subttlcmd:                ;1Cxx .subttl
  1449.     bsr    tmpreadd0l
  1450.     move.l    d0,(PRNSUBTTL,a6)
  1451.     rts
  1452.  
  1453. ;----------------------------------------------------------------
  1454. orgcmd:                    ;1Dxx .org
  1455.     bsr    tmpreadd0l        ;ロケーションカウンタ値を読み出す
  1456.     move.l    d0,(LOCATION,a6)
  1457.     tst.b    (MAKEPRN,a6)
  1458.     beq    orgcmd9
  1459.     movea.l    (PRNLPTR,a6),a0
  1460.     move.b    #'=',(a0)+
  1461.     bsr    convhex8
  1462.     move.l    a0,(PRNLPTR,a6)
  1463. orgcmd9:
  1464.     rts
  1465.  
  1466. ;----------------------------------------------------------------
  1467. endcmd:                    ;1Exx .end
  1468.     bsr    tmpreadsymex
  1469.     tst.w    d0
  1470.     bmi    iloprerr_not_fixed    ;未確定値ならエラー
  1471.     beq    iloprerr        ;定数ならエラー
  1472.     tst.b    d0
  1473.     bmi    iloprerr_end_xref    ;外部参照値ならエラー
  1474.     move.w    d0,d2
  1475.     move.w    #$E000,d0
  1476.     bsr    outobj1w
  1477.     move.w    d2,d0            ;実行開始セクション
  1478.     bsr    wrtd0w
  1479.     move.l    d1,d0            ;実行開始アドレス
  1480.     bra    wrtd0l
  1481.  
  1482. ;----------------------------------------------------------------
  1483. incldopen:                ;1Fxx includeファイル開始
  1484.     bsr    tmpreadd0l        ;ファイル名へのポインタ
  1485.     tst.b    (MAKEPRN,a6)
  1486.     bne    incldopen5
  1487.     movea.l    (INCLDINFPTR,a6),a0
  1488.     tst.w    (INCLDNEST,a6)
  1489.     bne    incldopen3
  1490.     lea.l    (INCLDINF,a6),a0
  1491. incldopen3:
  1492.     move.l    (LINENUM,a6),(a0)+    ;処理中の行番号を退避する
  1493.     move.l    (INPFILE,a6),(a0)+
  1494.     move.l    a0,(INCLDINFPTR,a6)
  1495.     move.l    d0,(INPFILE,a6)
  1496.     addq.w    #1,(INCLDNEST,a6)
  1497.     clr.l    (LINENUM,a6)
  1498.     rts
  1499.  
  1500. incldopen5:
  1501.     move.l    d0,-(sp)
  1502.     bsr    prnline
  1503.     movea.l    (sp)+,a0
  1504.     bsr    openincld
  1505.     st.b    (PFILFLG,a6)        ;ファイル名を付ける
  1506.     rts
  1507.  
  1508. ;----------------------------------------------------------------
  1509. incldend:                ;20xx includeファイル終了
  1510.     tst.b    (MAKEPRN,a6)
  1511.     bne    incldend5
  1512.     movea.l    (INCLDINFPTR,a6),a0    ;退避してあった行番号を戻す
  1513.     move.l    -(a0),(INPFILE,a6)
  1514.     move.l    -(a0),(LINENUM,a6)
  1515.     move.l    a0,(INCLDINFPTR,a6)
  1516.     subq.w    #1,(INCLDNEST,a6)
  1517.     rts
  1518.  
  1519. incldend5:
  1520.     bsr    prnline
  1521.     bsr    closeincld
  1522.     st.b    (PFILFLG,a6)        ;ファイル名を付ける
  1523.     rts
  1524.  
  1525. ;----------------------------------------------------------------
  1526. macdef:                    ;21xx マクロ定義開始
  1527.     bsr    tmpreadd0l
  1528.     movea.l    d0,a0            ;シンボルへのポインタ
  1529.     bsr    tmpreadd0l
  1530.     move.l    d0,(SYM_DEFINE,a0)    ;定義内容へのポインタ
  1531.     rts
  1532.  
  1533. ;----------------------------------------------------------------
  1534. macext:                    ;22xx マクロ展開開始
  1535.     tst.b    (MAKEPRN,a6)
  1536.     beq    macext5
  1537.     move.b    d0,-(sp)        ;オペレーションサイズ
  1538.  
  1539.     bsr    tmpreadd0l        ;シンボルへのポインタ
  1540.     movea.l    d0,a0
  1541.     move.l    a0,-(sp)
  1542.     movea.l    (SYM_DEFINE,a0),a0
  1543.     clr.w    d0
  1544.     bsr    exmacsetup        ;マクロ展開準備
  1545.     movea.l    (sp)+,a0
  1546.     move.b    (sp)+,(MACSIZE,a6)    ;オペレーションサイズ
  1547.     move.w    (SYM_MACLOCS,a0),d0
  1548.     add.w    d0,(MACLOCSMAX,a6)
  1549.     lea.l    (LINEBUF,a6),a0
  1550.     moveq.l    #0,d1
  1551.     bsr    tmpreadd0w        ;マクロ引数リストの開始位置
  1552.     move.w    d0,d1
  1553.     adda.l    d1,a0
  1554.  
  1555.     movea.l    (MACPARAEND,a6),a1
  1556.     bsr    defmacpara
  1557.     move.l    a1,(MACPARAEND,a6)
  1558.     rts
  1559.  
  1560. macext5:
  1561.     moveq.l    #3*2,d0
  1562.     bra    tempskip
  1563.  
  1564. ;----------------------------------------------------------------
  1565. exitmcmd:                ;23xx .exitm
  1566.     tst.b    (MAKEPRN,a6)
  1567.     bne    macexexitm
  1568.     rts
  1569.  
  1570. ;----------------------------------------------------------------
  1571. reptcmd:                ;24xx .rept展開開始
  1572.     tst.b    (MAKEPRN,a6)
  1573.     beq    reptcmd9
  1574.     bsr    tmpreadd0w
  1575.     move.w    d0,d1
  1576.     bsr    tmpreadd0l
  1577.     movea.l    d0,a0
  1578.     move.w    d1,d0
  1579.     suba.l    a1,a1
  1580.     bra    exmacsetup        ;次の行からrept開始
  1581.  
  1582. reptcmd9:
  1583.     moveq.l    #3*2,d0
  1584.     bra    tempskip
  1585.  
  1586. ;----------------------------------------------------------------
  1587. irpcmd:                    ;25xx .irp/.irpc展開開始
  1588.     tst.b    (MAKEPRN,a6)
  1589.     beq    irpcmd9
  1590.     bsr    tmpreadd0w
  1591.     move.w    d0,d1
  1592.     bsr    tmpreadd0l
  1593.     movea.l    d0,a1
  1594.     bsr    tmpreadd0l
  1595.     movea.l    d0,a0
  1596.     move.w    d1,d0
  1597.     bra    exmacsetup        ;次の行からirp/irpc開始
  1598.  
  1599. irpcmd9:
  1600.     moveq.l    #5*2,d0
  1601.     bra    tempskip
  1602.  
  1603. ;----------------------------------------------------------------
  1604. mdefbgn:                ;26xx マクロ等定義開始
  1605.     st.b    (ISMACDEF,a6)
  1606.     rts
  1607.  
  1608. ;----------------------------------------------------------------
  1609. mdefend:                ;27xx マクロ等定義終了
  1610.     sf.b    (ISMACDEF,a6)
  1611.     rts
  1612.  
  1613.  
  1614. ;----------------------------------------------------------------
  1615. ;    SCDデータ用ワークの初期化
  1616. ;----------------------------------------------------------------
  1617. scdinit:
  1618.     tst.b    (MAKESCD,a6)
  1619.     bne    scdinit01
  1620.     tst.b    (MAKESYMDEB,a6)
  1621.     bne    scdinit0
  1622.     rts                ;SCDコードは出力しない
  1623.  
  1624. scdinit0:                ;'-g'スイッチが指定された場合
  1625.     move.l    (LINENUM,a6),d0
  1626.     addq.l    #1,d0
  1627.     move.l    d0,(NUMOFLN,a6)
  1628.     moveq.l    #6,d0            ;関数本体,.bf,.efの分
  1629.     move.l    d0,(NUMOFSCD,a6)    ;拡張シンボル情報の数
  1630.     move.l    d0,(NUMOFFNC,a6)
  1631. scdinit01:
  1632.     move.l    (TEMPPTR,a6),d2
  1633.     doeven    d2
  1634.     movea.l    d2,a0
  1635.     move.l    d2,(SCDLNPTR,a6)    ;行番号データ用ワーク
  1636.     move.l    (NUMOFLN,a6),d0
  1637.     add.l    d0,d0
  1638.     move.l    d0,d1
  1639.     add.l    d0,d0
  1640.     add.l    d1,d0            ;d0×6
  1641.     add.l    d0,d2
  1642.     move.l    d2,(SCDDATAPTR,a6)    ;拡張シンボル情報用ワーク
  1643.     move.l    (NUMOFSCD,a6),d0
  1644.     addq.l    #8,d0            ;.file,.text,.data,.bssの分
  1645.     add.l    d0,d0
  1646.     move.l    d0,d1
  1647.     lsl.l    #3,d0
  1648.     add.l    d1,d0            ;d0×$12
  1649.     move.l    d0,(NUMOFSCD,a6)    ;使用する拡張シンボル情報のサイズ
  1650.     add.l    d0,d2
  1651.     move.l    d2,(TEMPPTR,a6)
  1652.     bsr    memcheck
  1653. scdinit1:
  1654.     clr.l    (a0)+            ;確保したワークをクリア
  1655.     cmp.l    a0,d2
  1656.     bhi    scdinit1
  1657.     lea.l    (NUMOFTAG,a6),a0    ;タグ/関数/変数データ数をデータ開始番号にする
  1658.     moveq.l    #5-1,d0
  1659.     moveq.l    #2,d1            ;最初の番号は2(.fileの次)
  1660. scdinit2:
  1661.     move.l    (a0),d2
  1662.     move.l    d1,(a0)+
  1663.     add.l    d2,d1
  1664.     dbra    d0,scdinit2
  1665.     move.l    (NUMOFTAG,a6),(TAGBEGIN,a6)
  1666.     move.l    (NUMOFGLB,a6),(GLBDEFNUM,a6)
  1667.     clr.l    (LNOFST,a6)
  1668.     tst.b    (MAKESYMDEB,a6)
  1669.     beq    scdtempclr
  1670.     moveq.l    #2,d0            ;'-g'スイッチが指定された場合
  1671.     movea.l    (SCDLNPTR,a6),a0
  1672.     move.l    d0,(a0)+        ;行番号データ最初のエントリを作成する
  1673.     clr.w    (a0)+
  1674.     moveq.l    #6,d0
  1675.     move.l    d0,(LNOFST,a6)
  1676.     moveq.l    #1,d0
  1677.     move.l    d0,(NUMOFLN,a6)
  1678. scdtempclr:                ;SCDデータ一時バッファをクリア
  1679.     lea.l    (SCDTEMP,a6),a0
  1680.     moveq.l    #(SCD_TBLLEN/4)-1,d0
  1681. scdtempclr1:
  1682.     clr.l    (a0)+
  1683.     dbra    d0,scdtempclr1
  1684.     move.w    #-2,(SCD_SECT+SCDTEMP,a6)
  1685.     rts
  1686.  
  1687. ;----------------------------------------------------------------
  1688. ;    SCDデータ番号から対応するバッファのアドレスを得る
  1689. getscdadr:
  1690.     movea.l    (SCDDATAPTR,a6),a0
  1691.     add.l    d0,d0
  1692.     move.l    d0,d1
  1693.     lsl.l    #3,d0
  1694.     add.l    d1,d0            ;d0×$12
  1695.     adda.l    d0,a0
  1696.     rts
  1697.  
  1698. ;----------------------------------------------------------------
  1699. lncmd:                    ;28xx .ln
  1700.     bsr    tmpreadd0w        ;行番号
  1701.     move.w    d0,d3
  1702.     bsr    tmpreadsymex        ;ロケーション
  1703.     cmpi.b    #SECT_TEXT,d0
  1704.     bne    iloprerr        ;.textセクション以外ならエラー
  1705.     movea.l    (SCDLNPTR,a6),a0
  1706.     adda.l    (LNOFST,a6),a0
  1707.     move.l    d1,(a0)+
  1708.     move.w    d3,(a0)+
  1709.     addq.l    #6,(LNOFST,a6)
  1710.     rts
  1711.  
  1712. ;----------------------------------------------------------------
  1713. valcmd:                    ;29xx .val
  1714.     bsr    tmpreadsymex        ;式の値を得る
  1715.     cmp.w    #$FF,d0
  1716.     bhi    iloprerr
  1717.     tst.w    d0
  1718.     bne    valcmd1
  1719.     moveq.l    #-1,d0            ;定数の場合(スタックフレームのオフセット値など)
  1720. valcmd1:
  1721.     move.l    d1,(SCD_VAL+SCDTEMP,a6)
  1722.     move.w    d0,(SCD_SECT+SCDTEMP,a6)
  1723.     rts
  1724.  
  1725. ;----------------------------------------------------------------
  1726. tagcmd:                    ;2Axx .tag
  1727.     bsr    tmpreadd0l
  1728.     movea.l    d0,a1            ;タグ名へのポインタ
  1729.     move.l    (TAGBEGIN,a6),d0
  1730.     bsr    tagsearch
  1731.     tst.l    d0
  1732.     beq    tagcmd9
  1733.     moveq.l    #2,d0
  1734.     bsr    tagsearch
  1735.     tst.l    d0
  1736.     bne    iloprerr        ;タグ名が存在しない
  1737. tagcmd9:
  1738.     rts
  1739.  
  1740. tagsearch:                ;タグ定義中から該当するタグを探す
  1741.     move.l    d0,d2
  1742.     bsr    getscdadr
  1743.     move.b    (SCD_SCL,a0),d0
  1744.     cmp.b    #10,d0            ;struct
  1745.     beq    tagsearch1
  1746.     cmp.b    #12,d0            ;union
  1747.     beq    tagsearch1
  1748.     cmp.b    #15,d0            ;enum
  1749.     bne    tagsearch9        ;タグではない
  1750. tagsearch1:
  1751.     movea.l    a0,a2
  1752.     movea.l    a1,a3
  1753.     tst.l    (a0)
  1754.     bne    tagsearch4
  1755.     move.l    (4,a0),d0        ;シンボル名が8文字以上
  1756.     movea.l    (EXNAMEPTR,a6),a2
  1757. tagsearch2:
  1758.     cmp.l    (4,a2),d0
  1759.     beq    tagsearch3
  1760.     movea.l    (a2),a2
  1761.     bra    tagsearch2
  1762.  
  1763. tagsearch3:
  1764.     addq.l    #8,a2
  1765. tagsearch4:
  1766.     move.b    (a2)+,d0
  1767.     cmp.b    (a3)+,d0
  1768.     bne    tagsearch5
  1769.     tst.b    d0
  1770.     bne    tagsearch4
  1771.     move.l    d2,(SCD_TAG+SCDTEMP,a6)    ;タグが見つかった
  1772.     moveq.l    #0,d0
  1773.     rts
  1774.  
  1775. tagsearch5:                ;タグ名が違う
  1776.     move.l    (SCD_NEXT,a0),d0
  1777.     bne    tagsearch        ;次のタグへ
  1778. tagsearch9:
  1779.     moveq.l    #-1,d0            ;該当するタグ名が見つからなかった
  1780.     rts
  1781.  
  1782. ;----------------------------------------------------------------
  1783. scdshort:                ;2Bxx .endef(短形式)
  1784. scdlong:                ;2Cxx .endef(長形式)
  1785.     move.w    d0,d2            ;データのタイプ
  1786.     lea.l    (SCDTEMP,a6),a0
  1787.     moveq.l    #4-1,d1
  1788. scddata1:
  1789.     bsr    tmpreadd0w        ;シンボル名
  1790.     move.w    d0,(a0)+
  1791.     dbra    d1,scddata1
  1792.     addq.l    #6,a0
  1793.     moveq.l    #2-1,d1
  1794. scddata2:
  1795.     bsr    tmpreadd0w        ;type/scl
  1796.     move.w    d0,(a0)+
  1797.     dbra    d1,scddata2
  1798.     tst.b    d0
  1799.     beq    scddata4
  1800.     addq.l    #4,a0            ;ロングデータの場合
  1801.     moveq.l    #6-1,d1
  1802. scddata3:
  1803.     bsr    tmpreadd0w        ;size/line/dim
  1804.     move.w    d0,(a0)+
  1805.     dbra    d1,scddata3
  1806. scddata4:
  1807.     cmpi.b    #16,(SCD_SCL+SCDTEMP,a6)
  1808.     bne    scddata5
  1809.     move.w    #-2,(SCD_SECT+SCDTEMP,a6)    ;enumメンバ名のセクション(存在しない)
  1810. scddata5:
  1811.     move.w    d2,d0
  1812.     move.w    d2,d1
  1813.     and.w    #$F0,d0
  1814.     cmp.w    #$10,d0
  1815.     beq    scddttag        ;タグ
  1816.     cmp.w    #$20,d0
  1817.     beq    scddtfnc        ;関数
  1818. scddata6:                ;データを書き込む
  1819.     and.w    #$00F0,d2
  1820.     lsr.w    #2,d2
  1821.     lea.l    (NUMOFSCD,a6),a1
  1822.     move.l    (a1,d2.w),d0
  1823.     bsr    getscdadr
  1824.     lea.l    (SCDTEMP,a6),a2
  1825.     move.b    (SCD_LEN,a2),d0
  1826.     ext.w    d0
  1827. scddata7:
  1828.     moveq.l    #9-1,d1
  1829. scddata8:
  1830.     move.w    (a2)+,(a0)+
  1831.     dbra    d1,scddata8
  1832.     addq.l    #1,(a1,d2.w)
  1833.     dbra    d0,scddata7
  1834.     bra    scdtempclr
  1835.  
  1836. scddttag:
  1837.     and.w    #$0F,d1
  1838.     beq    scddata6
  1839.     subq.w    #1,d1
  1840.     bne    scdtagend
  1841.     move.l    (NUMOFTAG,a6),(TAGDEFNUM,a6)    ;タグ定義開始
  1842.     bra    scddata6
  1843.  
  1844. scdtagend:                ;タグ定義終了
  1845.     bsr    scddata6        ;.eosデータを書き込む
  1846.     move.l    (TAGDEFNUM,a6),d0
  1847.     bsr    getscdadr
  1848.     move.l    (NUMOFTAG,a6),(SCD_NEXT,a0)    ;タグ定義チェインをつなぐ
  1849.     rts
  1850.  
  1851. scddtfnc:
  1852.     and.w    #$0F,d1
  1853.     beq    scddata6
  1854.     subq.w    #1,d1
  1855.     beq    scdfncbgn
  1856.     sub.w    #$B-1,d1
  1857.     beq    scdfncbb
  1858.     subq.w    #1,d1
  1859.     beq    scdfnceb
  1860.     subq.w    #1,d1
  1861.     beq    scdfncbf
  1862.     bra    scdfncef
  1863.  
  1864. scdfncbgn:                ;関数定義開始
  1865.     move.l    (NUMOFFNC,a6),(FNCDEFNUM,a6)
  1866.     move.l    (NUMOFTAG,a6),(TAGBEGIN,a6)    ;(関数外の同じタグ名に対応するため)
  1867.     clr.l    (FNCBBNUM,a6)
  1868.     movea.l    (LNOFST,a6),a0
  1869.     move.l    a0,(SCD_DIM+SCDTEMP,a6)
  1870.     adda.l    (SCDLNPTR,a6),a0
  1871.     move.l    (NUMOFFNC,a6),(a0)+
  1872.     clr.w    (a0)+
  1873.     addq.l    #6,(LNOFST,a6)
  1874.     bra    scddata6
  1875.  
  1876. scdfncbb:                ;ブロック開始
  1877.     move.l    (FNCBBNUM,a6),(SCD_NEXT+SCDTEMP,a6)
  1878.     move.l    (NUMOFFNC,a6),(FNCBBNUM,a6)
  1879.     bra    scddata6
  1880.  
  1881. scdfnceb:                ;ブロック終了
  1882.     bsr    scddata6        ;.ebデータを書き込む
  1883.     move.l    (FNCBBNUM,a6),d0
  1884.     bsr    getscdadr
  1885.     move.l    (SCD_NEXT,a0),(FNCBBNUM,a6)    ;ブロックチェインを一つ削る
  1886.     move.l    (NUMOFFNC,a6),(SCD_NEXT,a0)    ;.bbに.ebの次の位置を書き込む
  1887.     rts
  1888.  
  1889. scdfncbf:                ;関数開始
  1890.     move.l    (NUMOFFNC,a6),(FNCBFNUM,a6)
  1891.     bra    scddata6
  1892.  
  1893. scdfncef:                ;関数終了
  1894.     move.l    (FNCBFNUM,a6),d0
  1895.     bsr    getscdadr
  1896.     move.l    (NUMOFFNC,a6),(SCD_NEXT,a0)    ;.bfに.efの位置を書き込む
  1897.     bra    scddata6
  1898.  
  1899. ;----------------------------------------------------------------
  1900. funcend:                ;2Dxx .scl -1(関数定義終了)
  1901.     move.l    (FNCDEFNUM,a6),d0
  1902.     bsr    getscdadr
  1903.     move.l    (NUMOFFNC,a6),(SCD_NEXT,a0)    ;関数定義チェインをつなぐ
  1904.     move.l    (LOCATION,a6),d0
  1905.     sub.l    (SCD_VAL,a0),d0
  1906.     move.l    d0,(SCD_SIZE,a0)    ;関数サイズを書き込む
  1907.     move.l    #2,(TAGBEGIN,a6)
  1908.     rts
  1909.  
  1910.  
  1911. ;----------------------------------------------------------------
  1912. ;    SCDデータの出力
  1913. ;----------------------------------------------------------------
  1914. scdout:
  1915.     tst.b    (MAKESCD,a6)
  1916.     bne    scdout01
  1917.     tst.b    (MAKESYMDEB,a6)
  1918.     bne    scdout0
  1919.     rts                ;SCDコードは出力しない
  1920.  
  1921. scdout0:
  1922.     move.l    (NUMOFFNC,a6),d0    ;'-g'スイッチが指定された場合
  1923.     bsr    getscdadr        ;関数,.bf,.efのエントリを作成する
  1924.     movea.l    a0,a2
  1925.     move.l    (SCDFILENUM,a6),(4,a2)    ;関数名はソースファイル名とする
  1926.     moveq.l    #SECT_TEXT,d0
  1927.     move.w    d0,(SCD_SECT,a2)        ;セクション .text (関数)
  1928.     move.w    d0,(SCD_SECT+SCD_TBLLEN,a2)    ;          (.bf)
  1929.     move.w    d0,(SCD_SECT+SCD_TBLLEN*2,a2)    ;          (.ef)
  1930.     move.w    #$20,(SCD_TYPE,a2)    ;データ型 void() (関数)
  1931.     move.w    #$0301,(SCD_SCL,a2)    ;記憶クラス static (関数)
  1932.     move.w    #$6501,d0
  1933.     move.w    d0,(SCD_SCL+SCD_TBLLEN,a2)    ;記憶クラス.bf/.ef(.bf)
  1934.     move.w    d0,(SCD_SCL+SCD_TBLLEN*2,a2)    ;          (.ef)
  1935.     moveq.l    #SECT_TEXT,d0
  1936.     bsr    chgsection        ;.textセクションのサイズを得る
  1937.     move.l    (LOCATION,a6),d0
  1938.     move.l    d0,(SCD_SIZE,a2)    ;サイズ(関数)
  1939.     move.l    d0,(SCD_VAL+SCD_TBLLEN*2,a2)    ;シンボル値(.ef)
  1940.     moveq.l    #8,d0
  1941.     move.l    d0,(SCD_NEXT,a2)    ;次の関数エントリ(関数)
  1942.     moveq.l    #6,d0
  1943.     move.l    d0,(SCD_NEXT+SCD_TBLLEN,a2)    ;対応する.efの位置(.bf)
  1944.     move.w    #1,(SCD_SIZE+SCD_TBLLEN,a2)    ;最初の行番号(.bf)
  1945.     move.l    (LINENUM,a6),d0
  1946.     move.w    d0,(SCD_SIZE+SCD_TBLLEN*2,a2)    ;行数(.ef)
  1947.     lea.l    (scdstr_bfef,pc),a1
  1948.     lea.l    (SCD_TBLLEN,a2),a0
  1949.     bsr    strcpy            ;シンボル名'.bf'
  1950.     lea.l    (SCD_TBLLEN*2,a2),a0
  1951.     bsr    strcpy            ;シンボル名'.ef'
  1952. scdout01:
  1953.     bsr    scdtempclr
  1954.     lea.l    (scdsect_name,pc),a3    ;.fileエントリを準備
  1955.     move.l    (GLBDEFNUM,a6),(SCD_VAL+SCDTEMP,a6)
  1956.     move.w    #$6701,(SCD_SCL+SCDTEMP,a6)
  1957.     movea.l    (SCDFILE,a6),a0
  1958.     movea.l    a0,a2
  1959.     lea.l    (SCD_TAG+SCDTEMP,a6),a1
  1960.     moveq.l    #14-1,d0
  1961. scdout1:                ;ファイル名フィールドにファイル名を格納
  1962.     move.b    (a0)+,(a1)+
  1963.     dbeq    d0,scdout1
  1964.     beq    scdout15
  1965.     tst.b    (a0)
  1966.     beq    scdout15        ;14文字ちょうどの場合
  1967.     movea.l    a1,a0
  1968. scdout12:                ;ファイル名が14文字以上の場合
  1969.     move.b    (a2)+,d0
  1970.     beq    scdout15
  1971.     cmp.b    #'.',d0
  1972.     bne    scdout12        ;拡張子部分を探す
  1973.     moveq.l    #3,d0
  1974. scdout13:
  1975.     tst.b    (a2)+
  1976.     dbeq    d0,scdout13
  1977.     bne    scdout15        ;拡張子が3文字以上
  1978.     subq.l    #1,a2
  1979. scdout14:                ;拡張子が3文字以下なら,
  1980.     move.b    -(a2),d0        ;ファイル名+拡張子になるようにする
  1981.     move.b    d0,-(a0)
  1982.     cmp.b    #'.',d0
  1983.     bne    scdout14
  1984.     move.l    (SCDFILENUM,a6),(a1)
  1985. scdout15:
  1986.     moveq.l    #0,d0
  1987.     bsr    scdsectout        ;.fileを出力
  1988.     moveq.l    #SECT_ABS,d0
  1989.     bsr    chgsection
  1990.     move.l    (NUMOFLN,a6),(SCD_SIZE+SCDTEMP,a6)
  1991.     moveq.l    #3-1,d3
  1992.     lea.l    (LOCCTRBUF,a6),a4
  1993.     moveq.l    #0,d2            ;それまでのセクションサイズの合計
  1994.     moveq.l    #SECT_TEXT,d4
  1995.     move.l    (NUMOFSECT,a6),d5
  1996. scdout2:
  1997.     move.l    d2,(SCD_VAL+SCDTEMP,a6)
  1998.     move.w    d4,(SCD_SECT+SCDTEMP,a6)
  1999.     move.w    #$7801,(SCD_SCL+SCDTEMP,a6)
  2000.     move.l    (a4),(SCD_TAG+SCDTEMP,a6)    ;そのセクションのサイズ
  2001.     add.l    (a4)+,d2
  2002.     move.l    d5,d0
  2003.     bsr    scdsectout        ;.text/.data/.bssを出力
  2004.     addq.w    #1,d4
  2005.     addq.l    #2,d5
  2006.     dbra    d3,scdout2
  2007.     move.l    (LNOFST,a6),d0        ;行番号データ長
  2008.     bsr    wrtd0l
  2009.     move.l    (NUMOFSCD,a6),d0    ;拡張シンボルデータ長
  2010.     bsr    wrtd0l
  2011.     move.l    (EXNAMELEN,a6),d0    ;シンボル名延長データ長
  2012.     bsr    wrtd0l
  2013.     movea.l    (SCDLNPTR,a6),a0    ;行番号データを出力
  2014.     move.l    (LNOFST,a6),d1
  2015.     beq    scdout30        ;(行番号データがない)
  2016. scdout3:
  2017.     move.w    (a0)+,d0
  2018.     bsr    wrtd0w
  2019.     subq.l    #2,d1
  2020.     bhi    scdout3
  2021. scdout30:
  2022.     movea.l    (SCDDATAPTR,a6),a0    ;拡張シンボルデータを出力
  2023.     move.l    (NUMOFSCD,a6),d1
  2024. scdout31:
  2025.     move.w    (a0)+,d0
  2026.     bsr    wrtd0w
  2027.     subq.l    #2,d1
  2028.     bhi    scdout31
  2029.     lea.l    (EXNAMEPTR,a6),a0    ;シンボル名延長データを出力
  2030. scdout4:
  2031.     move.l    (a0),d0
  2032.     beq    scdout9            ;延長データが終了した
  2033.     movea.l    d0,a0
  2034.     lea.l    (8,a0),a1        ;データ本体
  2035. scdout5:
  2036.     clr.w    d0
  2037.     move.b    (a1)+,d0
  2038.     beq    scdout6
  2039.     lsl.w    #8,d0
  2040.     move.b    (a1)+,d0
  2041.     beq    scdout6
  2042.     bsr    wrtd0w
  2043.     bra    scdout5
  2044.  
  2045. scdout6:
  2046.     bsr    wrtd0w
  2047.     bra    scdout4
  2048.  
  2049. scdout9:
  2050.     rts
  2051.  
  2052. scdsectout:
  2053.     lea.l    (SCDTEMP,a6),a1
  2054.     movea.l    a1,a2
  2055. scdsectout1:                ;セクション名を書き込む
  2056.     move.b    (a3)+,(a2)+
  2057.     bne    scdsectout1
  2058.     bsr    getscdadr
  2059.     moveq.l    #18-1,d1        ;拡張シンボル情報バッファに出力する
  2060. scdsectout2:
  2061.     move.w    (a1)+,(a0)+
  2062.     dbra    d1,scdsectout2
  2063.     bra    scdtempclr
  2064.  
  2065. scdsect_name:                ;SCDに出力するセクション名
  2066.     .dc.b    '.file',0,'.text',0,'.data',0,'.bss',0
  2067.  
  2068. scdstr_bfef:
  2069.     .dc.b    '.bf',0,'.ef',0
  2070.     .even
  2071.  
  2072.  
  2073. ;----------------------------------------------------------------
  2074. ;    シンボル名テーブルの出力
  2075. ;----------------------------------------------------------------
  2076. prnsymtbl:
  2077.     tst.b    (MAKEPRN,a6)
  2078.     beq    prnsymtbl9
  2079.     tst.b    (ISNLIST,a6)
  2080.     bne    prnsymtbl9
  2081.     bsr    makesymptr        ;シンボルへのポインタテーブルを作成する
  2082.     moveq.l    #-1,d0
  2083.     bsr    prnnextpage        ;改ページする
  2084.     bsr    prnsymtable        ;シンボル名テーブルを表示する
  2085. prnsymtbl9:
  2086.     rts
  2087.  
  2088. ;----------------------------------------------------------------
  2089. ;    シンボルへのポインタテーブルを作成し、昇順にソートする
  2090. makesymptr:
  2091.     move.l    (TEMPPTR,a6),d0
  2092.     doquad    d0
  2093.     move.l    d0,(TEMPPTR,a6)
  2094.     movea.l    d0,a3
  2095.     movea.l    (MEMLIMIT,a6),a4
  2096.     movea.l    a3,a0            ;ポインタテーブルの先頭アドレス
  2097.  
  2098.     move.l    (SYMTBLBEGIN,a6),d3
  2099.     beq    makesymptr9        ;シンボルが一つもない
  2100. makesymptr1:
  2101.     movea.l    d3,a1
  2102.     move.w    #SYMEXTCOUNT-1,d2    ;1つのテーブルブロック中のシンボル数
  2103.     move.l    (a1)+,d3
  2104.     bne    makesymptr2        ;まだ続きのブロックがある
  2105.     sub.w    (SYMTBLCOUNT,a6),d2    ;最後のブロックの場合
  2106. makesymptr2:
  2107.     tst.b    (SYM_TYPE,a1)        ;cmpi.b #ST_VALUE,(SYM_TYPE,a1)
  2108.     bne    makesymptr5        ;数値シンボル以外なら何もしない
  2109.     cmpi.b    #SA_DEFINE,(SYM_ATTRIB,a1)
  2110.     blo    makesymptr5        ;値が確定していなければ何もしない
  2111.     move.l    a1,(a3)+        ;シンボルへのポインタ
  2112.     cmp.l    a3,a4
  2113.     bcc    makesymptr5
  2114.     addq.l    #4,sp            ;メモリが無くなったので
  2115.     rts                ;シンボルテーブルは作成しない
  2116.  
  2117. makesymptr5:
  2118.     lea.l    (SYM_TBLLEN,a1),a1    ;次のシンボルアドレス
  2119.     dbra    d2,makesymptr2
  2120.     tst.l    d3
  2121.     bne    makesymptr1        ;続きのテーブルブロックがある
  2122. makesymptr9:
  2123.     clr.l    (a3)            ;ポインタテーブルの終端
  2124.  
  2125. sortsymptr:
  2126.     move.l    a6,-(sp)
  2127.     moveq.l    #$FFFFFFFC,d2        ;下位2ビットマスク
  2128.     clr.l    -(sp)            ;スタックボトム
  2129.     bra    sortsymptr1
  2130.  
  2131. sortsymptr0:                ;スタックから区間両端のデータを得る
  2132.     movea.l    d0,a0
  2133.     movea.l    (sp)+,a3
  2134. sortsymptr1:
  2135.     move.l    a3,d0
  2136.     sub.l    a0,d0            ;区間サイズ
  2137.     lsr.l    #1,d0
  2138.     and.w    d2,d0            ;and.l
  2139.     beq    sortsymptr9        ;区間が1になったので分割終了
  2140.  
  2141.     lea.l    (a0,d0.l),a4        ;区間中央
  2142.     move.l    a4,d1
  2143.     movea.l    (a4),a5
  2144.     movea.l    (SYM_NAME,a5),a5
  2145.     movea.l    a0,a1
  2146.     movea.l    a3,a2
  2147.     bra    sortsymptr3
  2148.  
  2149. sortsymptr2:                ;データを交換する
  2150.     move.l    -(a1),d0
  2151.     move.l    (a2),(a1)+
  2152.     move.l    d0,(a2)
  2153. sortsymptr3:                ;先頭から交換対象データを検索
  2154.     movea.l    (a1)+,a4
  2155.     movea.l    (SYM_NAME,a4),a4
  2156.     movea.l    a5,a6
  2157. sortsymptr4:
  2158.     move.b    (a6)+,d0
  2159.     beq    sortsymptr5
  2160.     cmp.b    (a4)+,d0
  2161.     bhi    sortsymptr3
  2162.     beq    sortsymptr4
  2163. sortsymptr5:                ;末尾から交換対象データを検索
  2164.     movea.l    -(a2),a4
  2165.     movea.l    (SYM_NAME,a4),a4
  2166.     movea.l    a5,a6
  2167. sortsymptr6:
  2168.     move.b    (a4)+,d0
  2169.     beq    sortsymptr65
  2170.     cmp.b    (a6)+,d0
  2171.     bhi    sortsymptr5
  2172.     beq    sortsymptr6
  2173. sortsymptr65:
  2174.     cmpa.l    a1,a2            ;ポインタが交差するまで繰り返し
  2175.     bcc    sortsymptr2
  2176.     subq.l    #4,a1
  2177.     cmpa.l    d1,a1            ;短い方の区間を先に処理する
  2178.     bcc    sortsymptr8
  2179.  
  2180. sortsymptr7:                ;先頭の方を先に処理する
  2181.     movem.l    a1/a3,-(sp)
  2182.     movea.l    a1,a3
  2183.     bra    sortsymptr1
  2184.  
  2185. sortsymptr8:                ;末尾の方を先に処理する
  2186.     movem.l    a0/a1,-(sp)
  2187.     movea.l    a1,a0
  2188.     bra    sortsymptr1
  2189.  
  2190. sortsymptr9:
  2191.     move.l    (sp)+,d0
  2192.     bne    sortsymptr0
  2193.     movea.l    (sp)+,a6
  2194.     rts
  2195.  
  2196. ;----------------------------------------------------------------
  2197. ;    シンボル名テーブルを表示
  2198. prnsymtable:
  2199.     lea.l    (crlf_msg,pc),a0
  2200.     bsr    prnlout
  2201.     lea.l    (seg1_msg,pc),a0
  2202.     bsr    prnlout
  2203.     lea.l    (seg2_msg,pc),a0
  2204.     bsr    prnlout
  2205.     tst.b    (MAKERSECT,a6)
  2206.     beq    prnsymtable01
  2207.     lea.l    (seg21_msg,pc),a0
  2208.     bsr    prnlout
  2209. prnsymtable01:
  2210.     lea.l    (crlf_msg,pc),a0
  2211.     bsr    prnlout
  2212.     bsr    prnlout
  2213.     lea.l    (seg3_msg,pc),a0
  2214.     bsr    prnlout
  2215.     movea.l    (TEMPPTR,a6),a1        ;ポインタテーブルの先頭アドレス
  2216.     moveq.l    #0,d1
  2217.     move.w    (PRNWIDTH,a6),d1
  2218.     divu.w    #21,d1            ;1行に表示できるシンボルの数
  2219.     subq.w    #1,d1
  2220. prnsymtable1:
  2221.     lea.l    (OPRBUF,a6),a0
  2222.     move.w    d1,d2
  2223. prnsymtable2:                ;' xxxxxxxx(xx) xxxxxxxx '
  2224.     move.l    (a1)+,d0
  2225.     beq    prnsymtable9        ;全シンボルを表示した
  2226.     movea.l    d0,a2
  2227.     move.b    #' ',(a0)+
  2228.     move.l    (SYM_VALUE,a2),d0
  2229.     bsr    convhex8        ;シンボル値
  2230.     bsr    prnsymsec        ;セクション名
  2231.     move.b    #' ',(a0)+
  2232.     movea.l    (SYM_NAME,a2),a3
  2233.     moveq.l    #8-1,d0
  2234. prnsymtable3:
  2235.     move.b    (a3)+,(a0)+        ;シンボル名(先頭8文字)
  2236.     dbeq    d0,prnsymtable3
  2237.     bne    prnsymtable5
  2238.     subq.l    #1,a0
  2239. prnsymtable4:
  2240.     move.b    #' ',(a0)+
  2241.     dbra    d0,prnsymtable4
  2242. prnsymtable5:
  2243.     dbra    d2,prnsymtable2
  2244.   .if UNIX_NEWLINE=0
  2245.     move.b    #CR,(a0)+
  2246.   .endif
  2247.     move.b    #LF,(a0)+
  2248.     clr.b    (a0)
  2249.     lea.l    (OPRBUF,a6),a0
  2250.     bsr    prnlout            ;1行分を表示
  2251.     bra    prnsymtable1
  2252.  
  2253. prnsymtable9:
  2254.     cmp.w    d1,d2
  2255.     beq    prnsymtable0
  2256.   .if UNIX_NEWLINE=0
  2257.     move.b    #CR,(a0)+
  2258.   .endif
  2259.     move.b    #LF,(a0)+
  2260.     clr.b    (a0)
  2261.     lea.l    (OPRBUF,a6),a0
  2262.     bsr    prnlout            ;最後の1行を表示
  2263. prnsymtable0:
  2264.     lea.l    (crlf_msg,pc),a0
  2265.     bra    prnlout
  2266.  
  2267. ;----------------------------------------------------------------
  2268. ;    セクション名を表示
  2269. prnsymsec:
  2270.     move.b    (SYM_SECTION,a2),d0
  2271.     beq    prnsymabs        ;定数
  2272.     cmp.b    #SECT_XREF,d0
  2273.     beq    prnsymext        ;.xref
  2274.     cmp.b    #SECT_COMM,d0
  2275.     beq    prnsymcom        ;.comm
  2276.     cmp.b    #SECT_RCOMM,d0
  2277.     beq    prnsymrcom        ;.rcomm
  2278.     cmp.b    #SECT_RLCOMM,d0
  2279.     beq    prnsymrlcom        ;.rlcomm
  2280.     move.b    #'(',(a0)+
  2281.     bsr    convhex2        ;セクション番号
  2282.     move.b    #')',(a0)+
  2283.     rts
  2284.  
  2285. prnsymabs:
  2286.     lea.l    (abs_msg,pc),a3
  2287.     bra    prnsymout
  2288.  
  2289. prnsymext:
  2290.     lea.l    (ext_msg,pc),a3
  2291.     bra    prnsymout
  2292.  
  2293. prnsymcom:
  2294.     lea.l    (com_msg,pc),a3
  2295.     bra    prnsymout
  2296.  
  2297. prnsymrcom:
  2298.     lea.l    (rcom_msg,pc),a3
  2299.     bra    prnsymout
  2300.  
  2301. prnsymrlcom:
  2302.     lea.l    (rlcom_msg,pc),a3
  2303. prnsymout:
  2304.     moveq.l    #4-1,d0
  2305. prnsymout1:
  2306.     move.b    (a3)+,(a0)+
  2307.     dbra    d0,prnsymout1
  2308.     rts
  2309.  
  2310. seg1_msg:    mes    'セグメントテーブル'
  2311.         .dc.b    CRLF,0
  2312. seg2_msg:    .dc.b    ' 01 text     02 data     03 bss      04 stack   ',0
  2313. seg21_msg:    .dc.b    CRLF
  2314.         .dc.b    '             05 rdata    06 rbss     07 rstack  ',CRLF
  2315.         .dc.b    '             08 rldata   09 rlbss    0A rlstack ',0
  2316. seg3_msg:    mes    'シンボルテーブル'
  2317.         .dc.b    CRLF,0
  2318. abs_msg:    .dc.b    ' abs'
  2319. ext_msg:    .dc.b    ' ext'
  2320. com_msg:    .dc.b    ' com'
  2321. rcom_msg:    .dc.b    ' rcm'
  2322. rlcom_msg:    .dc.b    ' rlc'
  2323. undef_msg:    mes    '未定義シンボル'
  2324.         .dc.b    CRLF,0
  2325.     .even
  2326.  
  2327.  
  2328. ;----------------------------------------------------------------
  2329. ;    未定義シンボルリストの出力
  2330. ;----------------------------------------------------------------
  2331. prnundefsym:
  2332.     tst.b    (ISUNDEFSYM,a6)
  2333.     beq    prnundefsym9
  2334.     lea.l    (undef_msg,pc),a0
  2335.     bsr    prnstdout
  2336.  
  2337.     move.l    (SYMTBLBEGIN,a6),d3
  2338.     beq    prnundefsym9        ;シンボルが1つもない
  2339. prnundefsym1:
  2340.     movea.l    d3,a2
  2341.     move.w    #SYMEXTCOUNT-1,d2    ;1つのテーブルブロック中のシンボル数
  2342.     move.l    (a2)+,d3
  2343.     bne    prnundefsym2        ;まだ続きのブロックがある
  2344.     sub.w    (SYMTBLCOUNT,a6),d2    ;最後のブロックの場合
  2345.  
  2346. prnundefsym2:
  2347.     tst.b    (SYM_TYPE,a2)        ;cmpi.b #ST_VALUE,(SYM_TYPE,a2)
  2348.     bne    prnundefsym7        ;数値シンボル以外なら何もしない
  2349.     cmpi.b    #SA_DEFINE,(SYM_ATTRIB,a2)
  2350.     bcc    prnundefsym8        ;確定済みシンボル
  2351. prnundefsym3:
  2352.     lea.l    (LINEBUF,a6),a0
  2353.     movea.l    (SYM_NAME,a2),a1
  2354.     bsr    strcpy
  2355.     lea.l    (crlf_msg,pc),a1
  2356.     bsr    strcpy
  2357.     clr.b    (a0)
  2358.     lea.l    (LINEBUF,a6),a0
  2359.     bsr    prnstdout
  2360. prnundefsym8:
  2361.     lea.l    (SYM_TBLLEN,a2),a2    ;次のシンボルアドレス
  2362.     dbra    d2,prnundefsym2
  2363.     tst.l    d3
  2364.     bne    prnundefsym1        ;続きのテーブルブロックがある
  2365. prnundefsym9:
  2366.     rts
  2367.  
  2368. prnundefsym7:
  2369.     cmpi.b    #ST_REAL,(SYM_TYPE,a2)
  2370.     bne    prnundefsym8
  2371.     tst.b    (SYM_FSIZE,a2)
  2372.     bpl    prnundefsym8
  2373.     bra    prnundefsym3        ;未定義の浮動小数点実数シンボルの場合
  2374.  
  2375.  
  2376. ;----------------------------------------------------------------
  2377. ;    PRNファイル作成ルーチン
  2378. ;----------------------------------------------------------------
  2379.  
  2380. ;----------------------------------------------------------------
  2381. ;仮出力ルーチン
  2382. ;    仮出力済みでなければ従来のprnlineの処理を行って仮出力済みフラグをセット
  2383. ;    仮出力済みのときは1行目からprn1line4から
  2384. ;注意:仮出力を使うときは行の最後のデータまで仮出力を使って出力すること
  2385. prnlineadv:
  2386.     tst.b    (PFILFLG,a6)
  2387.     bne    prnfname
  2388.     tst.b    (ISNLIST,a6)
  2389.     bne    prnline9        ;.nlistされているので行を表示しない
  2390.     cmpi.w    #2,(PRNLATR,a6)
  2391.     bne    prnlineadv1
  2392.     tst.b    (ISLALL,a6)
  2393.     beq    prnline9        ;.sallでのマクロ展開行は表示しない
  2394. prnlineadv1:
  2395.     tst.b    (PADVFLG,a6)
  2396.     bne    prnlineadv2
  2397.     st.b    (PADVFLG,a6)
  2398.     bsr    prn1line
  2399.     bra    prnline9
  2400.  
  2401. prnlineadv2:
  2402.     movea.l    (PRNLPTR,a6),a1
  2403.     clr.b    (a1)
  2404.     lea.l    (PRNCODE,a6),a1
  2405. prnlineadv3:
  2406.     tst.b    (a1)
  2407.     ble    prnline9
  2408.     move.w    #15-1,d0
  2409.     lea.l    (OPRBUF,a6),a0
  2410. prnlineadv4:
  2411.     move.b    #' ',(a0)+
  2412.     dbra    d0,prnlineadv4
  2413.     bsr    prn1code        ;コード部を出力
  2414.   .if UNIX_NEWLINE=0
  2415.     move.b    #CR,(a0)+
  2416.   .endif
  2417.     move.b    #LF,(a0)+
  2418.     clr.b    (a0)
  2419.     lea.l    (OPRBUF,a6),a0
  2420.     bsr    prnlout
  2421.     bra    prnlineadv3
  2422.  
  2423. ;----------------------------------------------------------------
  2424. ;    1行出力する
  2425. prnline:
  2426.     tst.b    (PFILFLG,a6)
  2427.     bne    prnfname        ;ファイル名を表示する
  2428.     tst.b    (ISNLIST,a6)
  2429.     bne    prnline9        ;.nlistされているので行を表示しない
  2430.     cmpi.w    #2,(PRNLATR,a6)
  2431.     bne    prnline1
  2432.     tst.b    (ISLALL,a6)
  2433.     beq    prnline9        ;.sallでのマクロ展開行は表示しない
  2434. prnline1:
  2435. ;    仮出力済みでなければ従来のprnlineと同じ
  2436. ;    仮出力済みのときは出力せずに仮出力済みフラグをリセット
  2437.     tst.b    (PADVFLG,a6)
  2438.     beq    prnline2
  2439.     sf.b    (PADVFLG,a6)
  2440.     rts
  2441.  
  2442. prnline2:
  2443.     bsr    prn1line
  2444. prnline9:
  2445.     lea.l    (PRNCODE,a6),a0
  2446.     move.l    a0,(PRNLPTR,a6)
  2447.     rts
  2448.  
  2449. ;----------------------------------------------------------------
  2450. ;    PRNファイルのファイル名行を表示する
  2451. prnfname::
  2452.     sf.b    (PFILFLG,a6)
  2453.     lea.l    (OPRBUF,a6),a2
  2454.     move.b    #'<',(a2)+        ;'< ~ >'
  2455.     movea.l    (INPFILE,a6),a0
  2456.     bsr    getfilename
  2457. prnfname1:
  2458.     move.b    (a1)+,(a2)+
  2459.     bne    prnfname1
  2460.     move.b    #'>',(-1,a2)
  2461.   .if UNIX_NEWLINE=0
  2462.     move.b    #CR,(a2)+
  2463.   .endif
  2464.     move.b    #LF,(a2)+
  2465.     clr.b    (a2)
  2466.     lea.l    (OPRBUF,a6),a0
  2467.     bsr    prnlout
  2468.     bra    prnline9
  2469.  
  2470. ;----------------------------------------------------------------
  2471. ;    PRNファイル1行を表示する
  2472. prn1line:
  2473.     movea.l    (PRNLPTR,a6),a0
  2474.     clr.b    (a0)
  2475.     lea.l    (OPRBUF,a6),a0
  2476.     move.l    (LINENUM,a6),d0
  2477.     moveq.l    #5,d1            ;(5桁でゼロサプレス)
  2478.     bsr    convdec            ;'xxxxx '(行番号)
  2479.     move.b    #' ',(a0)+
  2480.     move.l    (LTOPLOC,a6),d0
  2481.     tst.b    (OFFSYMMOD,a6)
  2482.     ble    prn1line02
  2483.     movea.l    (OFFSYMTMP,a6),a1
  2484.     cmpi.b    #SA_DEFINE,(SYM_ATTRIB,a1)
  2485.     beq    prn1line01
  2486.     moveq.l    #0,d0            ;エラーのときは0にしておく
  2487.     bra    prn1line02
  2488.  
  2489. prn1line01:
  2490.     add.l    (OFFSYMVAL,a6),d0    ;+初期値
  2491.     sub.l    (SYM_VALUE,a1),d0    ;-仮シンボル値
  2492. prn1line02:
  2493.     bsr    convhex8        ;'xxxxxxxx '(ロケーションカウンタ)
  2494.     moveq.l    #' ',d0
  2495.     cmpi.w    #2,(PRNLATR,a6)
  2496.     bne    prn1line1
  2497.     moveq.l    #'*',d0            ;マクロ展開中
  2498. prn1line1:
  2499.     move.b    d0,(a0)+
  2500.     lea.l    (PRNCODE,a6),a1
  2501.     lea.l    (LINEBUF,a6),a2
  2502. prn1line2:
  2503.     bsr    prn1code        ;コード部を出力
  2504.     bsr    prn1srce        ;ソース部を出力
  2505.   .if UNIX_NEWLINE=0
  2506.     move.b    #CR,(a0)+
  2507.   .endif
  2508.     move.b    #LF,(a0)+
  2509.     clr.b    (a0)
  2510.     lea.l    (OPRBUF,a6),a0
  2511.     bsr    prnlout
  2512. prn1line3:
  2513.     tst.b    (a1)+
  2514.     bmi    prn1line3
  2515.     bne    prn1line4
  2516.     tst.b    (a2)
  2517.     beq    prn1line9
  2518. prn1line4:
  2519.     subq.l    #1,a1
  2520.     move.w    #15-1,d0        ;2行以上にまたがる場合
  2521.     lea.l    (OPRBUF,a6),a0
  2522. prn1line5:
  2523.     move.b    #' ',(a0)+
  2524.     dbra    d0,prn1line5
  2525.     bra    prn1line2
  2526.  
  2527. prn1line9:
  2528.     rts
  2529.  
  2530. prn1code:                ;コード部を出力
  2531.     move.w    #16-1,d0
  2532. prn1code1:
  2533.     move.b    (a1)+,(a0)+
  2534.     dble    d0,prn1code1
  2535.     bgt    prn1code5
  2536.     subq.l    #1,a0            ;コード部が途中で終了
  2537.     subq.l    #1,a1
  2538.     addq.w    #1,d0
  2539. prn1code2:
  2540.     move.b    #' ',(a0)+
  2541.     dbra    d0,prn1code2
  2542.     rts
  2543.  
  2544. prn1code5:                ;コード部が次の行に続く
  2545.     move.b    #' ',d0
  2546.     tst.b    (a1)
  2547.     ble    prn1code6
  2548.     tst.b    (1,a1)
  2549.     bgt    prn1code6
  2550.     move.b    (a1)+,d0
  2551. prn1code6:
  2552.     move.b    d0,(a0)+
  2553.     rts
  2554.  
  2555. prn1srce:                ;ソース部を出力
  2556.     clr.w    d0
  2557.     move.w    (PRNWIDTH,a6),d2
  2558.     sub.w    #32,d2
  2559. prn1srce1:
  2560.     move.b    (a2)+,d1
  2561.     beq    prn1srce9
  2562.     bmi    prn1srce2
  2563.     cmp.b    #TAB,d1
  2564.     bne    prn1srce5
  2565.     addq.w    #8,d0            ;TABコードの場合
  2566.     and.w    #$FFF8,d0
  2567.     bra    prn1srce6
  2568.  
  2569. prn1srce2:
  2570.   .if EUCSRC=0
  2571.     cmp.b    #$A0,d1
  2572.     bcs    prn1srce3
  2573.     cmp.b    #$E0,d1
  2574.     bcs    prn1srce5
  2575.   .else
  2576.     bra    prn1srce5        ;EUC
  2577.   .endif
  2578. prn1srce3:                ;漢字コードの場合
  2579.     addq.w    #2,d0
  2580.     cmp.w    d2,d0
  2581.     bhi    prn1srce9
  2582.     move.b    d1,(a0)+
  2583.     move.b    (a2)+,d1
  2584.     beq    prn1srce9
  2585.     bra    prn1srce6
  2586.  
  2587. prn1srce5:
  2588.     addq.w    #1,d0
  2589. prn1srce6:
  2590.     move.b    d1,(a0)+
  2591.     cmp.w    d2,d0
  2592.     bcs    prn1srce1
  2593.     rts
  2594.  
  2595. prn1srce9:
  2596.     subq.l    #1,a2
  2597.     rts
  2598.  
  2599.  
  2600. ;----------------------------------------------------------------
  2601. ;    シンボルファイル作成ルーチン
  2602. ;----------------------------------------------------------------
  2603. makesymfile::
  2604.     lea.l    (sym_msg,pc),a0
  2605.     bsr    prnlout
  2606.  
  2607.     move.l    (SYMTBLBEGIN,a6),d3
  2608.     beq    makesymfile9        ;シンボルが1つもない
  2609. makesymfile1:
  2610.     movea.l    d3,a2
  2611.     move.w    #SYMEXTCOUNT-1,d2    ;1つのテーブルブロック中のシンボル数
  2612.     move.l    (a2)+,d3
  2613.     bne    makesymfile2        ;まだ続きのブロックがある
  2614.     sub.w    (SYMTBLCOUNT,a6),d2    ;最後のブロックの場合
  2615. makesymfile2:
  2616.     cmpi.b    #ST_LOCAL,(SYM_TYPE,a2)
  2617.     beq    makesymfile8        ;ローカルシンボルなら何もしない
  2618.     lea.l    (LINEBUF,a6),a0
  2619.     movea.l    (SYM_NAME,a2),a1
  2620.     moveq.l    #16,d1
  2621. makesymfile3:
  2622.     subq.w    #1,d1
  2623.     move.b    (a1)+,(a0)+        ;シンボル名を転送
  2624.     bne    makesymfile3
  2625.     subq.l    #1,a0
  2626.     tst.w    d1
  2627.     bmi    makesymfile5
  2628. makesymfile4:
  2629.     move.b    #' ',(a0)+        ;余りをスペースで埋める
  2630.     dbra    d1,makesymfile4
  2631. makesymfile5:
  2632.     move.b    #' ',(a0)+
  2633.     move.b    #':',(a0)+
  2634.     move.b    #' ',(a0)+
  2635.  
  2636.     move.b    (SYM_TYPE,a2),d0
  2637.     cmp.b    #ST_REAL,d0
  2638.     beq    makesymreal
  2639.     cmp.b    #ST_REGSYM,d0
  2640.     beq    makesymreg
  2641.     cmp.b    #ST_MACRO,d0
  2642.     beq    makesymmac
  2643.     cmpi.b    #SA_DEFINE,(SYM_ATTRIB,a2)
  2644.     bcs    makesymundef
  2645.  
  2646.     lea.l    (symabs_msg,pc),a1
  2647.     move.b    (SYM_EXTATR,a2),d0
  2648.     beq    makesymabs
  2649.     cmp.b    #SECT_XREF,d0
  2650.     beq    makesymext
  2651.     cmp.b    #SECT_COMM,d0
  2652.     beq    makesymcom
  2653.     cmp.b    #SECT_RCOMM,d0
  2654.     beq    makesymrcom
  2655.     cmp.b    #SECT_RLCOMM,d0
  2656.     beq    makesymrlcom
  2657.     bra    makesymglobl
  2658.  
  2659. makesymext:
  2660.     lea.l    (symext_msg,pc),a1
  2661.     bra    makesymcom1
  2662.  
  2663. makesymcom:
  2664.     lea.l    (symcom_msg,pc),a1
  2665.     bra    makesymcom1
  2666.  
  2667. makesymrcom:
  2668.     lea.l    (symrcom_msg,pc),a1
  2669.     bra    makesymcom1
  2670.  
  2671. makesymrlcom:
  2672.     lea.l    (symrlcom_msg,pc),a1
  2673. makesymcom1:
  2674.     bsr    strcpy
  2675.     lea.l    (symno_msg,pc),a1
  2676.     bsr    strcpy
  2677.     move.l    (SYM_VALUE,a2),d0
  2678.     bsr    convhex4
  2679.     bra    makesymfile7
  2680.  
  2681. makesymglobl:
  2682.     lea.l    (symglb_msg,pc),a1
  2683. makesymabs:
  2684.     bsr    strcpy
  2685.     move.b    #' ',(a0)+
  2686.     clr.w    d0
  2687.     move.b    (SYM_SECTION,a2),d0
  2688.     mulu.w    #6,d0
  2689.     lea.l    (symsec_msg,pc,d0.w),a1
  2690.     bsr    strcpy
  2691.     move.b    #' ',(a0)+
  2692.     move.b    #' ',(a0)+
  2693.     move.b    #' ',(a0)+
  2694.     move.l    (SYM_VALUE,a2),d0
  2695.     bsr    convhex8
  2696.     bra    makesymfile7
  2697.  
  2698. makesymundef:
  2699.     lea.l    (symudf_msg,pc),a1
  2700.     bra    makesymmac1
  2701.  
  2702. makesymreal:
  2703.     tst.b    (SYM_FSIZE,a2)
  2704.     bmi    makesymundef        ;シンボルは未定義
  2705.     lea.l    (symreal_msg,pc),a1
  2706.     bra    makesymmac1
  2707.  
  2708. makesymreg:
  2709.     lea.l    (symreg_msg,pc),a1
  2710.     bra    makesymmac1
  2711.  
  2712. makesymmac:
  2713.     lea.l    (symmac_msg,pc),a1
  2714. makesymmac1:
  2715.     bsr    strcpy
  2716.  
  2717. makesymfile7:
  2718.   .if UNIX_NEWLINE=0
  2719.     move.b    #CR,(a0)+
  2720.   .endif
  2721.     move.b    #LF,(a0)+
  2722.     clr.b    (a0)
  2723.     lea.l    (LINEBUF,a6),a0
  2724.     bsr    prnlout
  2725. makesymfile8:
  2726.     lea.l    (SYM_TBLLEN,a2),a2    ;次のシンボルアドレス
  2727.     dbra    d2,makesymfile2
  2728.     tst.l    d3
  2729.     bne    makesymfile1        ;続きのテーブルブロックがある
  2730. makesymfile9:
  2731.     rts
  2732.  
  2733. symsec_msg:
  2734.     .dc.b    'abs  ',0,'text ',0,'data ',0,'bss  ',0,'stack',0
  2735.     .dc.b    'rdata',0,'rbss ',0,'rstck',0,'rldta',0,'rlbss',0,'rlstk',0
  2736. sym_msg:
  2737.     .dc.b    'SYMBOL           : class    section location',CRLF,CRLF,0
  2738. symabs_msg:    .dc.b    'absolute',0
  2739. symglb_msg:    .dc.b    'global  ',0
  2740. symext_msg:    .dc.b    'external',0
  2741. symcom_msg:    .dc.b    'common  ',0
  2742. symrcom_msg:    .dc.b    'rcommon ',0
  2743. symrlcom_msg:    .dc.b    'rlcommon',0
  2744. symudf_msg:    .dc.b    '(undefined)',0
  2745. symreg_msg:    .dc.b    '(register list)',0
  2746. symmac_msg:    .dc.b    '(macro)',0
  2747. symreal_msg:    .dc.b    '(float)',0
  2748. symno_msg:    .dc.b    '         No. ',0
  2749.     .even
  2750.  
  2751.  
  2752. ;----------------------------------------------------------------
  2753. ;    サブルーチン
  2754. ;----------------------------------------------------------------
  2755.  
  2756. ;----------------------------------------------------------------
  2757. ;    テンポラリファイルからシンボル番号・式を読み込み、その値を得る
  2758. ;    in :---
  2759. ;    out:d0.w=結果の属性(0:定数/1~4:アドレス値(セクション番号)/
  2760. ;                $FF:外部参照値/$FE:コモンシンボル/
  2761. ;                $FFFF:未定/$01FF:オフセット付き外部参照/$02FF:外部参照値)
  2762. ;        d1.l=結果の値/d2.w=サイズ
  2763. tmpreadsymex:
  2764.     bsr    tmpreadd0w
  2765.     move.w    d0,d2
  2766. tmpreadsymex1:
  2767.     and.w    #$FF00,d0
  2768.     cmp.w    #T_SYMBOL,d0
  2769.     bne    tmpreadexpr
  2770.  
  2771. ;----------------------------------------------------------------
  2772. ;    テンポラリファイルからシンボル番号を読み込み、その値を得る
  2773. ;    in :---
  2774. ;    out:d0.w=結果の属性/d1.l=結果の値
  2775. tmpreadsym:
  2776.     lea.l    (OPRBUF,a6),a0
  2777.     move.w    #RPN_SYMBOL,(a0)+
  2778.     bsr    tmpreadd0l
  2779.     move.l    d0,(a0)+
  2780.     clr.w    (a0)+
  2781.  
  2782. ;----------------------------------------------------------------
  2783. ;    最終的なシンボル値を得る
  2784. ;    in :d0.l=シンボルへのポインタ
  2785. ;    out:d0.w=結果の属性/d1.l=結果の値
  2786. getsymdata:
  2787.     movea.l    d0,a0
  2788.     cmpi.b    #ST_LOCAL,(SYM_TYPE,a0)    ;(ST_VALUE or ST_LOCAL)
  2789.     bhi    exprerr            ;数値シンボルでない
  2790.     cmpi.b    #SA_DEFINE,(SYM_ATTRIB,a0)
  2791.     blo    getsymdata01        ;未定義シンボル
  2792.     clr.w    d0
  2793.     move.b    (SYM_SECTION,a0),d0
  2794.     move.l    (SYM_VALUE,a0),d1
  2795.     rts
  2796.  
  2797. getsymdata01:
  2798.     cmpi.b    #ST_LOCAL,(SYM_TYPE,a0)    ;ローカルシンボルには名前がないので
  2799.     beq    getsymdata02        ;メッセージを分ける必要がある
  2800.     move.l    a0,(ERRMESSYM,a6)
  2801.     bra    undefsymerr
  2802.  
  2803. getsymdata02:
  2804.     cmpi.w    #100,(SYM_LOCALNO,a0)
  2805.     blo    undefsymerr_local
  2806.     bra    undefsymerr_offsym
  2807.  
  2808. ;----------------------------------------------------------------
  2809. ;    テンポラリファイルから逆ポーランド式を読み込み、その値を得る
  2810. ;    in :---
  2811. ;    out:d0.w=結果の属性/d1.l=結果の値
  2812. tmpreadexpr:
  2813.     bsr    tmpreadd0w
  2814.     move.w    d0,d1            ;逆ポーランド式の長さ
  2815.     lea.l    (OPRBUF,a6),a1
  2816. tmpreadexpr1:
  2817.     bsr    tmpreadd0w        ;式本体を読み込む
  2818.     move.w    d0,(a1)+
  2819.     dbra    d1,tmpreadexpr1
  2820.     clr.w    (a1)+            ;(エンドコード)
  2821.     lea.l    (OPRBUF,a6),a1
  2822.     bra    calcrpn            ;読み込んだ式を計算する
  2823.  
  2824. ;----------------------------------------------------------------
  2825. ;    式・シンボル値をファイルに出力する
  2826. ;    in :d0.w=データの存在するセクション/d1.l=データ/d2.w=データのサイズ
  2827. ;    out:---
  2828. outobjexpr:
  2829.     tst.w    d0
  2830.     beq    outobjconst        ;定数
  2831.     bmi    iloprerr_not_fixed    ;値が未確定
  2832.     cmp.b    #SECT_RLCOMM,d0
  2833.     bcs    outobjadrs        ;アドレス値
  2834.  
  2835.     cmp.w    #$01FF,d0
  2836.     beq    outobjrofst        ;オフセット付き外部参照値
  2837.     cmp.w    #$02FF,d0
  2838.     beq    outobjrexpr        ;外部参照を含む演算
  2839.  
  2840.     bsr    prnextcode        ;外部参照値の出力
  2841.     move.w    #$4000,d3
  2842.     bsr    outobjcom
  2843.     move.w    d1,d0
  2844.     bra    wrtd0w            ;シンボル番号を出力する
  2845.  
  2846. ;----------------------------------------------------------------
  2847. ;    定数の出力
  2848. outobjconst:
  2849.     cmp.b    #ESZ_ABS,d2
  2850.     bcc    outobjcon_abs
  2851. outobjcon_imm:                ;イミディエイトデータ
  2852.     bsrl    chkdtsize,d0
  2853.     move.l    d1,d0
  2854.     cmp.b    #SZ_SHORT,d2
  2855.     beq    out1bobj        ;.s
  2856.     cmp.b    #SZ_LONG,d2
  2857.     bne    out1wobj        ;.b/.w
  2858.     bra    out1lobj        ;.l
  2859.  
  2860. outobjcon_abs:                ;絶対アドレッシングデータ
  2861.     cmp.b    #ESZ_ADR,d2
  2862.     bcc    outobjcon_adr
  2863.     cmp.b    #ESZ_ABS|SZ_LONG,d2
  2864.     beq    outobjcon_absl
  2865. outobjcon_absw:
  2866.     move.w    d1,d0
  2867.     ext.l    d0
  2868.     cmp.l    d1,d0
  2869.     beq    outobjcon_absw1
  2870.     cmp.l    #$00010000,d1
  2871.     bcc    overflowerr
  2872.     bsr    shvalwarn_d16
  2873. outobjcon_absw1:
  2874.     bsr    absshwarn
  2875.     bra    out1wobj
  2876.  
  2877. outobjcon_absl:
  2878.     bsr    abswarn
  2879.     move.l    d1,d0
  2880.     bra    out1lobj        ;.l
  2881.  
  2882. outobjcon_adr:                ;アドレスレジスタ間接ディスプレースメント
  2883.     cmp.b    #ESZ_ADR|SZ_SHORT,d2
  2884.     beq    outobjcon_adrs
  2885.     cmp.b    #ESZ_ADR|SZ_WORD,d2
  2886.     beq    outobjcon_adrw
  2887.     move.l    d1,d0
  2888.     bra    out1lobj        ;.l
  2889.  
  2890. outobjcon_adrs:
  2891.     move.b    d1,d0
  2892.     ext.w    d0
  2893.     ext.l    d0
  2894.     cmp.l    d1,d0
  2895.     beq    out1bobj
  2896.     cmp.l    #$00000100,d1
  2897.     bcc    overflowerr
  2898.     bsr    shvalwarn_d8
  2899.     bra    out1bobj
  2900.  
  2901. outobjcon_adrw:
  2902.     move.w    d1,d0
  2903.     ext.l    d0
  2904.     cmp.l    d1,d0
  2905.     beq    out1wobj
  2906.     cmp.l    #$00010000,d1
  2907.     bcc    overflowerr
  2908.     bsr    shvalwarn_d16
  2909.     bra    out1wobj
  2910.  
  2911. ;----------------------------------------------------------------
  2912. ;    アドレス値の出力
  2913. outobjadrs:
  2914.     and.w    #3,d2
  2915.     cmp.b    #SECT_RDATA,d0
  2916.     bcc    outobjadrs1        ;相対セクションではエラーにしない
  2917.     cmp.b    #SZ_LONG,d2
  2918.     bne    iladrerr        ;.l以外はエラー
  2919. outobjadrs1:
  2920.     tst.b    (MAKEPRN,a6)
  2921.      beq    outobjadrs9
  2922.     movea.l    (PRNLPTR,a6),a0        ;'(xx)xxxxxxxx'
  2923.     move.b    #'(',(a0)+
  2924.     bsr    convhex2        ;セクション番号
  2925.     move.b    #')',(a0)+
  2926.     move.w    d0,-(sp)
  2927.     move.l    d1,d0
  2928.     cmp.b    #SZ_LONG,d2
  2929.     beq    outobjadrs3
  2930.     cmp.b    #SZ_WORD,d2
  2931.     beq    outobjadrs2
  2932.     bsr    convhex2
  2933.     bra    outobjadrs4
  2934.  
  2935. outobjadrs2:
  2936.     bsr    convhex4
  2937.     bra    outobjadrs4
  2938.  
  2939. outobjadrs3:
  2940.     bsr    convhex8
  2941. outobjadrs4:
  2942.     move.b    #-1,(a0)+
  2943.     move.l    a0,(PRNLPTR,a6)
  2944.     move.w    (sp)+,d0
  2945. outobjadrs9:
  2946.     move.w    #$4000,d3
  2947.     bsr    outobjcom
  2948.     move.l    d1,d0
  2949.     bra    wrtd0l
  2950.  
  2951. ;----------------------------------------------------------------
  2952. ;    オフセット付き外部参照値の出力
  2953. outobjrofst:
  2954.     bsr    prnextcode
  2955.     move.w    #$5000,d3
  2956.     bsr    outobjcom
  2957.     move.w    (ROFSTSYMNO,a6),d0
  2958.     bsr    wrtd0w
  2959.     move.l    d1,d0
  2960.     bra    wrtd0l
  2961.  
  2962. ;----------------------------------------------------------------
  2963. ;    外部参照値を含む式の出力
  2964. outobjrexpr:
  2965.     bsr    prnextcode
  2966.     bsr    outobjrpn
  2967.     move.w    d2,d0
  2968.     and.w    #3,d0
  2969.     lsl.w    #8,d0
  2970.     or.w    #$9000,d0
  2971.     bra    outobj1w
  2972.  
  2973. ;----------------------------------------------------------------
  2974. prnextcode:                ;外部参照データをPRNファイルに出力する
  2975.     tst.b    (MAKEPRN,a6)
  2976.     beq    prnextcode9
  2977.     movea.l    (PRNLPTR,a6),a0
  2978.     move.w    d0,-(sp)
  2979.     move.w    d2,d0
  2980.     bsr    getdtsize
  2981.     add.w    d0,d0
  2982.     subq.w    #1,d0
  2983. prnextcode1:
  2984.     move.b    #'?',(a0)+
  2985.     dbra    d0,prnextcode1
  2986.     move.l    a0,(PRNLPTR,a6)
  2987.     move.w    (sp)+,d0
  2988. prnextcode9:
  2989.     rts
  2990.  
  2991. ;----------------------------------------------------------------
  2992. ;    オブジェクトファイルの逆ポーランド式を出力する
  2993. ;    in :---
  2994. ;    out:---
  2995. outobjrpn:
  2996.     lea.l    (OPRBUF,a6),a1
  2997. outobjrpn1:
  2998.     move.w    (a1)+,d0
  2999.     beq    outobjrpn9        ;式が終了(RPN_END)
  3000.     move.w    d0,d1
  3001.     and.w    #$FF00,d1
  3002.     cmp.w    #RPN_VALUEB,d1
  3003.     beq    outobjrpnb        ;.b
  3004.     cmp.w    #RPN_VALUEW,d1
  3005.     beq    outobjrpnw        ;.w
  3006.     cmp.w    #RPN_VALUE,d1
  3007.     beq    outobjrpnl        ;.l
  3008.     cmp.w    #RPN_SYMBOL,d1
  3009.     beq    outobjrpnsym        ;シンボル
  3010.     cmp.w    #RPN_LOCATION,d1
  3011.     beq    outobjrpnloc        ;現在のロケーションカウンタ値
  3012.     cmp.w    #RPN_OPERATOR,d1
  3013.     bne    exprerr
  3014.     and.w    #$00FF,d0        ;演算子
  3015.     or.w    #$A000,d0
  3016.     bsr    outobj1w
  3017.     bra    outobjrpn1
  3018.  
  3019. outobjrpn9:
  3020.     rts
  3021.  
  3022. outobjrpnb:                ;数値データ
  3023.     moveq.l    #0,d1
  3024.     move.b    d0,d1
  3025.     bra    outobjrpncon
  3026.  
  3027. outobjrpnw:
  3028.     moveq.l    #0,d1
  3029.     move.w    (a1)+,d1
  3030.     bra    outobjrpncon
  3031.  
  3032. outobjrpnl:
  3033.     move.l    (a1)+,d1
  3034. outobjrpncon:                ;定数値を演算スタックに積むコード
  3035.     move.w    #$8000,d0
  3036.     bsr    outobj1w
  3037. outobjrpncon1:
  3038.     move.l    d1,d0
  3039.     swap.w    d0
  3040.     bsr    outobj1w
  3041.     swap.w    d0
  3042.     bsr    outobj1w
  3043.     bra    outobjrpn1
  3044.  
  3045. outobjrpnsym:                ;シンボル
  3046.     move.l    (a1)+,d0
  3047.     bsr    getsymdata
  3048.     or.w    #$8000,d0
  3049.     bsr    outobj1w
  3050.     cmp.b    #SECT_RLCOMM,d0
  3051.     bcs    outobjrpncon1
  3052.     move.w    d1,d0            ;外部参照値の場合、参照番号を出力
  3053.     bsr    outobj1w
  3054.     bra    outobjrpn1
  3055.  
  3056. outobjrpnloc:                ;現在のロケーションカウンタ値
  3057.     move.l    (LTOPLOC,a6),d1        ;'*'
  3058.     tst.b    d0
  3059.     beq    outobjrpnloc1
  3060.     move.l    (LCURLOC,a6),d1        ;'$'
  3061. outobjrpnloc1:
  3062.     move.w    #$8000,d0
  3063.     move.b    (SECTION,a6),d0
  3064.     bsr    outobj1w
  3065.     bra    outobjrpncon1
  3066.  
  3067. ;----------------------------------------------------------------
  3068. ;    セクション番号/サイズを含めたオブジェクトファイルコマンドを出力する
  3069. ;    in :d0.b=セクション番号/d2.w=データサイズ/d3.w=オブジェクトファイルコマンド
  3070. ;    out:---
  3071. outobjcom:
  3072.     movem.w    d0/d2,-(sp)
  3073.     exg.l    d0,d3
  3074.     move.b    d3,d0
  3075.     and.w    #$0003,d2
  3076.     lsl.w    #8,d2
  3077.     or.w    d2,d0
  3078.     bsr    outobj1w
  3079.     movem.w    (sp)+,d0/d2
  3080.     rts
  3081.  
  3082. ;----------------------------------------------------------------
  3083. ;    文字列をファイルに出力する
  3084. ;    in :a0=文字列へのポインタ
  3085. ;    out:a0=文字列終了位置へのポインタ
  3086. wrtstr:
  3087.     move.w    d0,-(sp)
  3088. wrtstr1:
  3089.     clr.w    d0
  3090.     move.b    (a0)+,d0
  3091.     beq    wrtstr9
  3092.     lsl.w    #8,d0
  3093.     move.b    (a0)+,d0
  3094.     beq    wrtstr9
  3095.     bsr    wrtd0w
  3096.     bra    wrtstr1
  3097.  
  3098. wrtstr9:
  3099.     bsr    wrtd0w
  3100.     move.w    (sp)+,d0
  3101.     rts
  3102.  
  3103. ;----------------------------------------------------------------
  3104. ;    オブジェクトを1ロングワード出力する
  3105. ;    in :d0.l=出力データ
  3106. ;    out:---
  3107. out1lobj:
  3108.     swap.w    d0
  3109.     bsr    out1wobj
  3110.     swap.w    d0
  3111.  
  3112. ;----------------------------------------------------------------
  3113. ;    オブジェクトを1ワード出力する
  3114. ;    in :d0.w=出力データ
  3115. ;    out:---
  3116. out1wobj:
  3117.     move.w    d0,-(sp)
  3118.     lsr.w    #8,d0
  3119.     bsr    out1bobj
  3120.     move.w    (sp)+,d0
  3121.  
  3122. ;----------------------------------------------------------------
  3123. ;    オブジェクトを1バイト出力する
  3124. ;    in :d0.b=出力データ
  3125. ;    out:---
  3126. out1bobj:
  3127.     tst.l    (DSBSIZE,a6)
  3128.     beq    out1bobj1
  3129.     bsr    outdsb
  3130. out1bobj1:
  3131.     tst.b    (MAKEPRN,a6)
  3132.     beq    out1bobj2
  3133.     move.l    a0,-(sp)
  3134.     movea.l    (PRNLPTR,a6),a0
  3135.     bsr    convhex2
  3136.     move.l    a0,(PRNLPTR,a6)
  3137.     movea.l    (sp)+,a0
  3138. out1bobj2:
  3139.     bra    wrt1bobj0        ;(ロケーションカウンタは変更しない)
  3140.  
  3141. ;----------------------------------------------------------------
  3142. ;    オブジェクト出力後、1ワード出力する
  3143. ;    in :d0.w=出力データ
  3144. ;    out:---
  3145. outobj1w:
  3146.     tst.l    (DSBSIZE,a6)
  3147.     beq    wrtobjd0w
  3148.     bsr    outdsb
  3149.     bra    wrtobjd0w
  3150.  
  3151. ;----------------------------------------------------------------
  3152. ;    .ds.bのデータを出力する
  3153. ;    in :---
  3154. ;    out:---
  3155. outdsb:
  3156.     move.l    d0,-(sp)
  3157.     move.w    #$3000,d0        ;3000 [長さ] :.ds.b
  3158.     bsr    wrtobjd0w
  3159.     move.l    (DSBSIZE,a6),d0
  3160.     bsr    wrtd0l
  3161.     clr.l    (DSBSIZE,a6)
  3162.     move.l    (sp)+,d0
  3163.     rts
  3164.  
  3165.  
  3166. ;----------------------------------------------------------------
  3167.     .end
  3168.  
  3169. ;----------------------------------------------------------------
  3170. ;    $Log: objgen.s,v $
  3171. ;    Revision 2.9  1999 10/ 8(Fri) 21:52:11 M.Kamada
  3172. ;    +86 改行コードの変更に対応
  3173. ;    +86 EUC対応準備
  3174. ;    +86 '%s に外部参照値は指定できません'
  3175. ;
  3176. ;    Revision 2.8  1999  3/ 3(Wed) 14:47:01 M.Kamada
  3177. ;    +82 エラーメッセージを日本語化
  3178. ;    +82 メッセージを日本語化
  3179. ;    +82 T_ERRORを$FF00から通常のコードに変更
  3180. ;    +82 doeven→doquad
  3181. ;
  3182. ;    Revision 2.7  1999  2/27(Sat) 23:43:22 M.Kamada
  3183. ;    +81 ソースリストのフォーマットを変更(実行ファイルは+80とまったく同じ)
  3184. ;
  3185. ;    Revision 2.6  1999  2/25(Thu) 03:37:23 M.Kamada
  3186. ;    +80 objgen.sのchkdtsizeの参照をbsrlに変更
  3187. ;    +80 ColdFire対応
  3188. ;    +80 .offsym <初期値>,<シンボル>
  3189. ;
  3190. ;    Revision 2.5  1998 10/10(Sat) 02:34:36 M.Kamada
  3191. ;    +77 -pのとき.INSERTで1度に256バイト以上読み出すと誤動作する
  3192. ;
  3193. ;    Revision 2.4  1998  1/24(Sat) 17:56:16 M.Kamada
  3194. ;    +57 疑似命令.sizemを追加
  3195. ;
  3196. ;    Revision 2.3  1998  1/ 9(Fri) 22:25:16 M.Kamada
  3197. ;    +56 -f43gを削除
  3198. ;
  3199. ;    Revision 2.2  1997 10/13(Mon) 15:40:56 M.Kamada
  3200. ;    +51 直後へのbsr→pea
  3201. ;    +52 jmp/jsrを最適化する
  3202. ;
  3203. ;    Revision 2.1  1997  9/15(Mon) 16:05:17 M.Kamada
  3204. ;    +46 ST_VALUE=0で最適化
  3205. ;
  3206. ;    Revision 2.0  1997  9/14(Sun) 18:46:52 M.Kamada
  3207. ;    +45 $opsize,shift
  3208. ;
  3209. ;    Revision 1.9  1997  6/25(Wed) 13:39:30 M.Kamada
  3210. ;    +33 プレデファインシンボルCPUに対応
  3211. ;    +34 プレデファインシンボルに対応
  3212. ;
  3213. ;    Revision 1.8  1996 11/13(Wed) 15:28:40 M.Kamada
  3214. ;    +04 ??で始まるシンボルを外部定義にしない
  3215. ;        ??で始まるシンボルを外部定義にしない
  3216. ;
  3217. ;    Revision 1.7  1994/07/13  14:10:16  nakamura
  3218. ;    若干のバグフィックス
  3219. ;
  3220. ;    Revision 1.6  1994/04/25  14:33:58  nakamura
  3221. ;    最適化を行わないときに不正なオブジェクトファイルを出力することのあるバグを修正。
  3222. ;
  3223. ;    Revision 1.5  1994/04/12  15:09:08  nakamura
  3224. ;    -m68000/68010で(d,An)が最適化されないことがあるバグを修正。
  3225. ;
  3226. ;    Revision 1.4  1994/03/10  15:54:40  nakamura
  3227. ;    次の命令へのブランチを削除すると暴走するバグを修正
  3228. ;
  3229. ;    Revision 1.3  1994/03/06  13:03:06  nakamura
  3230. ;    68000,68010モードで32bitディスプレースメントを出力してしまうバグをfix
  3231. ;    .ln疑似命令がひとつもないソースをアセンブルすると異常なSCDコードを出力するバグをfix
  3232. ;    jbra,jbsr,jbccおよびopcに対する処理を追加
  3233. ;    '$'が正しいロケーションカウンタ値を指さないことがあるバグをfix
  3234. ;    エラー発生時にラベルの定義値とロケーションアドレスがずれるバグをfix
  3235. ;
  3236. ;    Revision 1.2  1994/02/20  14:25:22  nakamura
  3237. ;    シンボルテーブルポインタの偶数境界調整を忘れていたので修正。
  3238. ;
  3239. ;    Revision 1.1  1994/02/15  12:12:58  nakamura
  3240. ;    Initial revision
  3241. ;
  3242. ;
  3243.